分块0pts(AC#11)求调
查看原帖
分块0pts(AC#11)求调
957105
zzbzwjx楼主2024/9/1 22:13
#include<bits/stdc++.h>
using namespace std;
int l,t,o,a,b,c,s,p[100001],q[3333];
void change(int l,int r,int x){
	int lid=(l-1)/s+1,rid=(r-1)/s+1;
	if(q[lid])
		for(int i=(lid-1)*s+1;i<=lid*s;i++)
			p[i]=q[lid];
	q[lid]=0;
	if(q[rid])
		for(int i=(rid-1)*s+1;i<=min(rid*s,l);i++)
			p[i]=q[rid];
	q[rid]=0;
	if(lid==rid){
		for(int i=l;i<=r;i++)p[i]=x;
		return ;
	}
	for(int i=l;i<=lid*s;i++)p[i]=x;
	for(int i=lid+1;i<rid;i++)q[i]=x;
	for(int i=(rid-1)*s+1;i<=r;i++)p[i]=x;
}
int query(int l,int r){
	int lid=(l-1)/s+1,rid=(r-1)/s+1;
	if(q[lid])
		for(int i=(lid-1)*s+1;i<=lid*s;i++)
			p[i]=q[lid];
	q[lid]=0;
	if(q[rid])
		for(int i=(rid-1)*s+1;i<=min(rid*s,l);i++)
			p[i]=q[rid];
	q[rid]=0;
	long long ans=0;
	bool vis[33]={0};
	if(lid==rid){
		for(int i=l;i<=r;i++)
			if(!vis[p[i]])ans++,vis[p[i]]=1;
		return ans;
	}
	for(int i=l;(i-1)/s+1==lid;i++)
		if(!vis[p[i]])ans++,vis[p[i]]=1;
	for(int i=lid+1;i<rid;i++)
		if(q[i])if(!vis[q[i]])ans++,vis[q[i]]=1;
		else for(int j=(i-1)*s+1;j<=i*s;j++)
				if(!vis[p[j]])ans++,vis[p[j]]=1;
	for(int i=(rid-1)*s+1;i<=r;i++)
		if(!vis[p[i]])ans++,vis[p[i]]=1;
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>l>>t>>o;
	s=sqrt(l)+1;
	for(int i=1;i<=l;i++)p[i]=1;
	for(int i=1;i<=s;i++)q[i]=1;
	while(o--){
		char ch[4];
		cin>>ch>>a>>b;
		if(a>b)swap(a,b);
		if(*ch=='C'){cin>>c;change(a,b,c);}
		else cout<<query(a,b)<<'\n';
	}
	return 0;
}
2024/9/1 22:13
加载中...