带修莫队求调
查看原帖
带修莫队求调
351390
gxxjqqiang楼主2024/3/18 19:44

把 P1903 的代码改一下交过来 WA 了

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,S=1e6+5;char ch;
int n,m,m2,k,a[N],l=1,r,t,cnt[S],ans[N],res;
int fr[N],to[N],rp[N],og[N];
struct node{int l,r,t;}q[N];
bool cmp(node x,node y){
	if(x.l/k!=y.l/k)return x.l<y.l;
	if(x.r/k!=y.r/k)return x.r<y.r;
	return x.t<y.t;
}
inline void add(int x){
	if(x<l||x>r)return;
	if(!cnt[a[x]]++)res++;
}
inline void del(int x){
	if(x<l||x>r)return;
	if(!--cnt[a[x]])res--;
}
inline void addt(int x){del(fr[x]);a[fr[x]]=to[x];add(fr[x]);}
inline void delt(int x){del(fr[x]);a[fr[x]]=rp[x];add(fr[x]);}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m2;k=pow(n,2.0/3);
	for(int i=1;i<=n;i++)
		cin>>a[i],og[i]=a[i];
	for(int i=1,u,v;i<=m2;i++){
		cin>>ch>>u>>v;u++;
		if(ch=='Q')q[++m]={u,v,m};
		else fr[i]=u,to[i]=v,rp[i]=og[u],og[u]=v;
	}sort(q+1,q+1+m,cmp);
	for(int i=1;i<=m;i++){
		while(t<q[i].t){if(fr[++t])addt(t);}
		while(t>q[i].t){if(fr[t])delt(t);t--;}	
		while(l>q[i].l)add(--l);
		while(r<q[i].r)add(++r);
		while(l<q[i].l)del(l),l++;
		while(r>q[i].r)del(r),r--;
		ans[q[i].t]=res;
	}
	for(int i=1;i<=m;i++)
		cout<<ans[i]<<'\n';
	return 0;
}
2024/3/18 19:44
加载中...