社区讨论
全 WA 求调
P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhz4hktx
- 此快照首次捕获于
- 2025/11/15 01:19 4 个月前
- 此快照最后确认于
- 2025/11/16 13:59 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1.4e5+5,M=1e6+5;
int s;inline int id(int x){return (x+s-1)/s;}
struct Query{
int l,r,t,idx;
Query(int _l=1,int _r=0,int _t=0,int _idx=0){l=_l;r=_r;t=_t;idx=_idx;}
inline bool operator<(const Query &A)const{
if (id(l)!=id(A.l)) return id(l)<id(A.l);
if (id(r)!=id(A.r)) return id(r)<id(A.r);
if (t!=A.t) return t<A.t;
return idx<A.idx;
}
}q[N];
struct Update{int x,k;Update(int _x=0,int _k=0){x=_x;k=_k;}}u[N];
int n,m,v[N];
int cntu,cntq,ans[N];
int cnt[M],kind;
inline void del(int x){if (--cnt[x]==0) --kind;}
inline void add(int x){if (++cnt[x]==1) ++kind;}
inline void movetime(int l,int r,int now){
int p=u[now].x;
if (l<=p&&p<=r){
del(v[p]);
add(u[now].k);
}
swap(v[p],u[now].k);
}
inline void solve(){
int l=1,r=0,t=0;
for (int i=1;i<=cntq;i++){
int ql=q[i].l,qr=q[i].r,qt=q[i].t;
while (l<ql) del(v[l++]);
while (l>ql) add(v[--l]);
while (r<qr) add(v[++r]);
while (r>qr) del(v[r--]);
while (t<qt) movetime(l,r,++t);
while (t>qt) movetime(l,r,t--);
ans[q[i].idx]=kind;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m;s=pow(n,2.0/3);
for (int i=1;i<=n;i++) cin>>v[i];
for (int i=1;i<=m;i++){
char op;int l,r;
cin>>op>>l>>r;
if (op=='Q') q[++cntq]={l,r,cntu,cntq};
else u[++cntu]={l,r};
}
sort(q+1,q+cntq+1);
solve();
for (int i=1;i<=cntq;i++)
cout<<ans[i]<<'\n';
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...