只过了最后三个点求调qwq
查看原帖
只过了最后三个点求调qwq
186068
我怂了楼主2023/8/6 10:01

别人都是只WA最后三个点的qwq

#include<bits/stdc++.h>
#define deb
//#define int long long
using namespace std;
const int maxn=2e5;
const int maxp=pow(maxn,2.0/3.0);
struct ass{
	int id,l,r,t;
}Q[maxn];
struct ope{
	int t,pos,v;
}O[maxn];
int c1,c2,n,p,m,cnt[int(1e6+5)],a[maxn],ann;
bool cmp(ass a,ass b){
	if(a.l/p==b.l/p){
		return a.r/p==b.r/p?a.t<b.t:a.r<b.r;
	}
	else{
		return a.l<b.l;
	}
}
int l=1,r=1,t=1,pp=1;
void op(int x){
	if(l<=x&&x<=r){
		cnt[a[O[x].pos]]--;
		if(!cnt[a[O[x].pos]]){
			ann--;
		}
		if(!cnt[O[x].v]){
			ann++;
		}
		cnt[O[x].v]++;
	}	
	swap(O[x].v,a[O[x].pos]);
}
void add(int x){
	if(!cnt[a[x]]){
		ann++;
	}
	cnt[a[x]]++;
}
int ans[maxn];
void del(int x){
	cnt[a[x]]--;
	if(!cnt[a[x]]){
		ann--;
	}
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	cout<<"Hello World!\n";
	cin>>n>>m;
	p=pow(n,0.666);
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int l,r;
		char op;
		cin>>op>>l>>r;
		if(op=='Q'){
			Q[++c1].id=c1;
			Q[c1].l=l;
			Q[c1].r=r;
			Q[c1].t=i;
		}
		else{
			O[++c2].pos=l;
			O[c2].t=i;
			O[c2].v=r;
		}
	}
	sort(Q+1,Q+1+c1,cmp);
	add(1);
	for(int i=1;i<=c1;i++){
		while(l<Q[i].l){
			del(l);
			l++;
		}
		while(l>Q[i].l){
			l--;
			add(l);
		}
		while(r>Q[i].r){
			del(r);
			r--;
		}
		while(r<Q[i].r){
			r++;
			add(r);
		}
		while(O[pp].t<Q[i].t&&pp<=c2){
			op(pp);
			pp++;
		}
		while(O[pp-1].t>Q[i].t&&pp){
			op(pp-1);
			pp--;
		}
		ans[Q[i].id]=ann;
	}
	for(int i=1;i<=c1;i++){
		cout<<ans[i]<<'\n'; 
	}
	return 0;
}

2023/8/6 10:01
加载中...