蒟蒻分块全WA求调,赠送一个关注
查看原帖
蒟蒻分块全WA求调,赠送一个关注
329698
youdu666楼主2022/8/26 16:58
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<bitset>
using namespace std;
const int N=1e5+5,LN=325,T=35;
int cl[LN][T],l[LN],r[LN],q[N],qn;
int a[N],um[LN];
bitset<T> tmp;
int n,t,m,zc;
char c;
inline void update(int x,int y,int v)
{
	int qx=q[x],qy=q[y];
//	printf("???%d %d\n",x,y);
	if(um[qx])
	{
		for(int i=l[qx];i<=r[qx];i++)
		a[i]=um[qx];
		um[qx]=0;
	}
	if(um[qy])
	{
		for(int i=l[qy];i<=r[qy];i++)
		a[i]=um[qy];
		um[qy]=0;
	}
	if(qx==qy)
	{
		for(int i=x;i<=y;i++)
		cl[qx][a[i]]--,cl[qx][v]++,a[i]=v;
//		printf("V=%d\n",v);
		return;
	}
	for(int i=x;i<=r[qx];i++)
	cl[qx][a[i]]--,cl[qx][v]++,a[i]=v;
	for(int i=l[qy];i<=y;i++)
	cl[qy][a[i]]--,cl[qy][v]++,a[i]=v;
	for(int i=qx+1;i<=qy-1;i++)
	{
		for(int j=1;j<=t;j++)
		cl[i][j]=0;
		cl[i][v]=r[i]-l[i]+1;
		um[i]=v;
	}
}
inline int query(int x,int y)
{
	for(int i=1;i<=t;i++) tmp[i]=0;
	int qx=q[x],qy=q[y];
	if(qx==qy)
	{
		if(um[qx])
		return 1;
		for(int i=x;i<=y;i++)
		tmp[a[i]]=1;
		int ans=0;
		for(int i=1;i<=t;i++)if(tmp[i])ans++;
		return ans;
	}
	if(um[qx])
	tmp[um[qx]]=1;
	else
	{
		for(int i=x;i<=r[qx];i++)
		tmp[a[i]]=1;
	}
	if(um[qy])
	tmp[um[qy]]=1;
	else
	{
		for(int i=l[qy];i<=y;i++)
		tmp[a[i]]=1;
	}
	for(int i=qx+1;i<=qy-1;i++)
	{
		if(um[i]) tmp[um[i]]=1;
		else
		{
			for(int j=1;j<=t;j++)
			tmp[j]=cl[i][j]>0;
		}
	}
	int ans=0;
	for(int i=1;i<=t;i++)
	if(tmp[i])
	ans++;
	return ans;
}
int x,y,z;
signed main()
{
//	n=read(),t=read(),m=read();
	std::ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>t>>m;
	zc=sqrt(n);
	for(int i=1;i<=n;i+=zc)
	{
		l[++qn]=i,r[qn]=min(n,i+zc-1);
		for(int j=i;j<=r[qn];j++)
		q[j]=qn;
	}
	update(1,n,1);
	for(int i=1;i<=m;i++)
	{
//		scanf("%c",&c);
		cin>>c;
//		printf("%c",c);
		if(c=='C')
		{
//			scanf("%d%d%d",&x,&y,&z);
			cin>>x>>y>>z;
			if(x>y) x^=y^=x^=y;
			update(x,y,z);
		}
		else
		{
//			scanf("%d%d",&x,&y);
			cin>>x>>y;
			if(x>y) x^=y^=x^=y;
//			printf("%d\n",query(x,y));
			cout<<query(x,y)<<endl;
		}
	}
//	for(int i=1;i<=n;i++)
////	printf("%d ",um[q[i]]?um[q[i]]:a[i]);
//	cout<<(um[q[i]]?um[q[i]]:a[i])<<" ";
}
2022/8/26 16:58
加载中...