带修莫队tle求助
查看原帖
带修莫队tle求助
580202
Siegerkranz_2735楼主2024/7/14 16:37

rt,tle on#7#8#9#10

#include<bits/stdc++.h>
using namespace std;
struct query{
	int l,r,id,t;
}q[133340];
struct replace{
	int loc,col;
}r[133340];
int n,m,sz,cnt,a[133340],b[1000005],ans[133340];
char s;
bool cmp(query a,query b){
	if(a.l/sz==b.l/sz){
		if(a.r/sz==b.r)a.t<b.t;
		return a.r<b.r;
	}
	return a.l<b.l;
}
void del(int x){
	b[x]--;
	if(b[x]==0)cnt--;
}
void add(int x){
	if(b[x]==0)cnt++;
	b[x]++;
}
void update(int que,int t){
	if(r[t].loc>=q[que].l&&r[t].loc<=q[que].r){
		del(a[r[t].loc]);
		add(r[t].col);
	}
	swap(a[r[t].loc],r[t].col);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	int cntQ=0,cntR=0;
	for(int i=1;i<=m;i++){
		cin>>s;
		if(s=='Q'){
			cntQ++;
			scanf("%d%d",&q[cntQ].l,&q[cntQ].r);
			q[cntQ].t=cntR,q[cntQ].id=cntQ;
		}
		else {
			cntR++;
			scanf("%d%d",&r[cntR].loc,&r[cntR].col);
		}
	}
	sz=pow(n,0.666);
	sort(q+1,q+cntQ+1,cmp);
	int l=0,r=0,t=0;
	for(int i=1;i<=cntQ;i++){
		while(l<q[i].l)del(a[l++]);
		while(l>q[i].l)add(a[--l]);
		while(r<q[i].r)add(a[++r]);
		while(r>q[i].r)del(a[r--]);
		while(t>q[i].t)update(i,t--);
		while(t<q[i].t)update(i,++t);
		ans[q[i].id]=cnt; 
	}
	for(int i=1;i<=cntQ;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
}
2024/7/14 16:37
加载中...