hack数据T了
查看原帖
hack数据T了
235901
Always_Remember_It楼主2023/10/1 13:59
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=31;
int l,t,o;
int num,lt[N],rt[N],in[N],g1[N];
bool vis[M];
set<int> g2[N];
void block(){
	num=sqrt(l);
	if(num*num!=l) ++num;
	int lar=num;
	if(num*(num-1)>=l&&num*num!=l) --lar;
	for(int i=1;i<num;i++){
		lt[i]=rt[i-1]+1;
		rt[i]=i*lar;
	}
	lt[num]=rt[num-1]+1;
	rt[num]=l;
	for(int i=1;i<=rt[num-1];i++){
		in[i]=(i-1)/lar+1;
	}
	for(int i=lt[num];i<=l;i++){
		in[i]=num;
	}
}
void update(int a,int b,int c){
	if(a==lt[in[a]]&&b==rt[in[b]]){
		g2[in[a]].clear();
		g2[in[a]].insert(c);
		return;
	}
	if(g2[in[a]].size()==1){
		int now=*g2[in[a]].begin();
		if(now==c) return;
		g2[in[a]].insert(c);
		for(int i=lt[in[a]];i<a;i++){
			g1[i]=now;
		}
		for(int i=a;i<=b;i++){
			g1[i]=c;
		}
		for(int i=b+1;i<=rt[in[b]];i++){
			g1[i]=now;
		}
		return;
	}
	g2[in[a]].clear();
	for(int i=lt[in[a]];i<a;i++){
		g2[in[i]].insert(g1[i]);
	}
	for(int i=a;i<=b;i++){
		g1[i]=c;
	}
	g2[in[a]].insert(c);
	for(int i=b+1;i<=rt[in[b]];i++){
		g2[in[i]].insert(g1[i]);
	}
	return;
}
void change(int a,int b,int c){
	if(in[a]==in[b]){
		update(a,b,c);
		return;
	}
	update(a,rt[in[a]],c);
	for(int i=in[a]+1;i<in[b];i++){
		g2[i].clear();
		g2[i].insert(c);
	}
	update(lt[in[b]],b,c);
}
int query(int a,int b){
	int res=0;
	if(g2[in[a]].size()==1){
		if(!vis[*g2[in[a]].begin()]) res=1;
		vis[*g2[in[a]].begin()]=1;
		return res;
	}
	for(int i=a;i<=b;i++){
		if(!vis[g1[i]]) ++res;
		vis[g1[i]]=1;
	}
	return res;
}
int ask(int a,int b){
	memset(vis,0,sizeof(vis));
	if(in[a]==in[b]) return query(a,b);
	int res=query(a,rt[in[a]])+query(lt[in[b]],b);
	for(int i=in[a]+1;i<in[b];i++){
		set<int>::iterator it;
		for(it=g2[i].begin();it!=g2[i].end();it++){
			if(!vis[*it]) ++res;
			vis[*it]=1;
		}
	}
	return res;
}
inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s*f;
}
int main(){
	l=read(),t=read(),o=read();
	block();
	for(int i=1;i<=l;i++){
		g1[i]=1;
	}
	change(1,l,1);
	for(int i=1;i<=o;i++){
		char op;cin>>op;
		int a=read(),b=read();
		if(a>b) swap(a,b);
		if(op=='C'){
			int c=read();
			change(a,b,c);
			continue;
		}
		printf("%d\n",ask(a,b));
	}
	return 0;
}
2023/10/1 13:59
加载中...