蒟蒻0分求调教
查看原帖
蒟蒻0分求调教
754502
_AyachiNene楼主2023/3/6 19:38

思路事第一篇题的思路,不知道哪里错了,但好像哪里都错了

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,b,f;
}a[114514*4+1][35];
int l,o,ans,A,B,C,t;
char c;
bool vis[114];
void bld(int l,int r,int root,int cnt)
{
	a[root][cnt].l=l;
	a[root][cnt].r=r;
	if(l==r)
	{
		if(cnt==1)
			a[root][cnt].b=1;
		return;
	}
	int mid=(l+r)/2;
	bld(l,mid,root*2,cnt);
	bld(mid+1,r,root*2+1,cnt);
}
void down(int root,int cnt)
{
	a[root*2][cnt].f=a[root][cnt].f;
	a[root*2+1][cnt].f=a[root][cnt].f;
	a[root*2][cnt].b=a[root][cnt].f;
	a[root*2+1][cnt].b=a[root][cnt].f;
	a[root][cnt].f=0;
}
void sum(int x,int y,int root,int cnt)
{
	if(a[root][cnt].l>=x&&a[root][cnt].r<=y)
	{	
		if(a[root][cnt].b&&!vis[cnt])
			ans++,vis[cnt]=1;
		return;
	}
	if(a[root][cnt].f)
		down(root,cnt);
	int mid=(a[root][cnt].l+a[root][cnt].r)/2;
	if(x<=mid)
		sum(x,y,root*2,cnt);
	if(y>mid)
		sum(x,y,root*2+1,cnt);
}
void add(int x,int y,int root,int cnt)
{
	if(a[root][cnt].l>=x&&a[root][cnt].r<=y)
	{	
		if(cnt==C)
		{
			a[root][cnt].b=1;
			a[root][cnt].f=1;
		}
		else
		{
			a[root][cnt].b=0;
			a[root][cnt].f=0;
		}
		return;
	}
	if(a[root][cnt].f)
		down(root,cnt);
	int mid=(a[root][cnt].l+a[root][cnt].r)/2;
	if(x<=mid)
		add(x,y,root*2,cnt);
	if(y>mid)
		add(x,y,root*2+1,cnt);
}
int main()
{
	cin>>l>>t>>o;
	for(int i=1;i<=t;i++)
		bld(1,l,1,i);
	while(o--)
	{
		cin>>c>>A>>B;
		if(c=='C')
		{
			cin>>C;
			for(int i=1;i<=t;i++)
				add(A,B,1,i);
		}
		else
		{
			ans=0;
			memset(vis,0,sizeof vis);
			for(int i=1;i<=t;i++)
				sum(A,B,1,i);
			cout<<ans<<endl;
		}
	}
}
2023/3/6 19:38
加载中...