社区讨论
TLE求卡常
P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo25zia8
- 此快照首次捕获于
- 2023/10/23 08:33 2 年前
- 此快照最后确认于
- 2023/11/03 08:49 2 年前
CPP
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+10;
int n,a[N],pos[N],m,tot,b[1000010],cnt,x,y;
char opt;
struct query{int l,r,t,ans,id;}q[N];
struct cg{int t,pos,x;}g[N];
inline bool cmp(query& a,query& b){
if(pos[a.l]==pos[b.l]){
if(pos[a.l]&1)return a.r<b.r;
else return a.r>b.r;
}
return pos[a.l]<pos[b.l];
}
inline bool cmp1(query& a,query& b){return a.id<b.id;}
inline void sub(int x){
if(--b[x]==0)cnt--;
}
inline void add(int x){
if(b[x]++==0)cnt++;
}
inline void turn(int l,int r,int i){
if(g[i].pos<=r&&g[i].pos>=l)sub(a[g[i].pos]),add(g[i].x);
swap(g[i].x,a[g[i].pos]);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(register int i(1);i<=n;++i)cin>>a[i];
int t=1;
for(register int i(1);i<=m;++i){
cin>>opt>>x>>y;
if(opt=='R')g[++t]=(cg){t,x,y};
else q[++tot]=(query){x,y,t,0,i};
}
int block=ceil(exp((log(n)+log(t))/3));
for(register int i(1);i<=n;++i)pos[i]=(i-1)/block+1;
sort(q+1,q+tot+1,cmp);
int l=1,r=0;
t=1;
for(register int i(1);i<=tot;++i){
while(l<q[i].l)sub(a[l++]);
while(l>q[i].l)add(a[--l]);
while(r<q[i].r)add(a[++r]);
while(r>q[i].r)sub(a[r--]);
while(t>q[i].t)turn(l,r,t--);
while(t<q[i].t)turn(l,r,++t);
q[i].ans=cnt;
}
sort(q+1,q+tot+1,cmp1);
for(register int i(1);i<=tot;++i)cout<<q[i].ans<<endl;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...