社区讨论
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 条回复,欢迎继续交流。
正在加载回复...