萌新求调莫队
查看原帖
萌新求调莫队
482049
Alex_wcq楼主2022/8/20 11:44

如题,WA 70,校内 OJ 过了,挂了的点都 WA 在几千行

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,kc,c[133343],cnt[1000010];
int sum,a[133343];
struct query{
	int l,r,id,t;
}q[133343];
int ux[133343],uv[133343],ul[133343];
bool operator <(query a,query b){
	if(a.l/kc!=b.l/kc) return a.l<b.l;
	if(a.r/kc!=b.r/kc) return a.r<b.r;
	return a.t<b.t;
}
int l=1,r=0,t=0;
void add(int x){
	if(cnt[x]==0) ++sum;
	++cnt[x];
}
void del(int x){
	--cnt[x];
	if(cnt[x]==0) --sum;
}
void work(int t){
	c[ux[t]]=uv[t];
	if(ux[t]<=r&&ux[t]>=l){
		add(uv[t]);
		del(ul[t]);
	}
}
void rework(int t){
	c[ux[t]]=ul[t];
	if(ux[t]<=r&&ux[t]>=l){
		add(ul[t]);
		del(uv[t]);
	}
}
void solve(){
	kc=pow(n,2.0/3.0);
	sort(q+1,q+m+1);
	for(int i=1;i<=m;++i){
		//cout<<i<<" "<<q[i].l<<" "<<q[i].r<<endl;
		if(q[i].l==q[i].r){
			a[q[i].id]=0;
			continue;
		}
		while(t>q[i].t) rework(t--);
		while(t<q[i].t) work(++t);
		while(l>q[i].l) add(c[--l]);
		while(r<q[i].r) add(c[++r]);
		while(l<q[i].l) del(c[l++]);
		while(r>q[i].r) del(c[r--]);
		a[q[i].id]=sum;
		//cout<<q[i].id<<" "<<sum<<endl;
	}
}
int tc[133343];
int main(){
	int cm,ti=0;
	scanf("%d%d",&n,&cm);
	for(int i=1;i<=n;++i){
		scanf("%d",&c[i]);
		tc[i]=c[i];
	}
	for(int i=1;i<=cm;++i){
		char op;
		scanf(" %c",&op);
		if(op=='R'){
			++ti;
			scanf("%d%d",&ux[ti],&uv[ti]);
			ul[ti]=tc[ux[ti]];
			tc[ux[ti]]=uv[ti];
			continue;
		}
		++m;
		q[m].id=m; q[m].t=ti;
		scanf("%d%d",&q[m].l,&q[m].r);
	}
	solve();
	for(int i=1;i<=m;++i)
		printf("%d\n",a[i]);
	return 0;
}
2022/8/20 11:44
加载中...