社区讨论

0分求助

P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo8i1hlp
此快照首次捕获于
2023/10/27 18:57
2 年前
此快照最后确认于
2023/10/27 18:57
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct ckw{
	int l,r,t,id;
}q[140000];
struct lmy{
	int p,col,t,cols;
}x[140000];
int a[140000],n,m,cnt,kc,tn,nl=1,nr,co[140000],out[140000],ans,cnq;
bool f[140000];
char opt;
bool cmp(ckw a,ckw b){
	if(a.l/kc==b.l/kc){
		if(a.r/kc==b.r/kc)
		  return a.t<b.t;
		return a.r<b.r;
	}
	return a.l<b.l;
}
void add(int x){
	co[x]++;
	if(co[x]==1)
	  ans++;
}
void del(int x){
	co[x]--;
	if(co[x]==0)
	  ans--;
}
void det(int w,int t){
	if(q[w].l<=x[t].p&&q[w].r>=x[t].p){
		x[t].cols=a[x[t].p];
		del(a[x[t].p]);
		add(x[t].col);
	}
	swap(x[t].col,x[t].cols);
}
int main(){
	scanf("%d%d",&n,&m);
	kc=pow(n,0.6666667);
	for(int i=1;i<=n;i++)
	   scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
	   cin>>opt;
	   if(opt=='Q'){
	   	  cnq++;
	   	  scanf("%d%d",&q[cnq].l,&q[cnq].r);
	   	  q[cnq].t=cnt;
	   	  q[cnq].id=cnq;
	   }
	   else{
	      ++cnt;
	   	  scanf("%d%d",&x[cnt].p,&x[cnt].col);
	   	  x[cnt].t=cnt;
	   }
	}
	sort(q+1,q+cnq+1,cmp);
	for(int i=1;i<=cnq;i++){
		while(nl<q[i].l)del(a[nl++]);
		while(nl>q[i].l)add(a[--nl]);
		while(nr<q[i].r)add(a[++nr]);
		while(nr>q[i].r)del(a[nr--]);
		while(tn>q[i].t)det(i,tn--);
		while(tn<q[i].t)det(i,++tn);
		out[q[i].id]=ans;
	}
	for(int i=1;i<=cnq;i++)
	   printf("%lld\n",out[i]);
	   return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...