Title
Solution
注意cnt数组要开大,然后q[i].id=cntq而不是i!!!
带修莫队就是在普通莫队上加上一维时间轴。
不太会证明块的大小与莫队时间复杂度的影响,这道题似乎要将块的大小设置为
n
2
3
n^{\frac{2}{3}}
n32会比较优秀
Code
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=2e5+5,M=1e6+5;
int read(){
int p=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar();
return p;
}
char s[101];
int n,m,size,cnt[M],ans[N],val,a[N],cntq,cntr,b[N],t;
struct node{
int l,r,t,id;
}q[N];
struct node2{
int l,r;
}c[N];
bool cmp(node x,node y){
return (b[x.l]^b[y.l])?b[x.l]<b[y.l]:((b[x.r]^b[y.r])?b[x.r]<b[y.r]:x.t<y.t);
}
int main(){
n=read(),m=read();
size=(int)pow(n,2.0/3.0);
rep(i,1,n) b[i]=(i-1)/size+1;
rep(i,1,n) a[i]=read();
rep(i,1,m){
scanf("%s",s);
if (s[0]=='Q') q[++cntq].l=read(),q[cntq].r=read(),q[cntq].id=cntq,q[cntq].t=cntr;
else if (s[0]=='R') c[++cntr].l=read(),c[cntr].r=read();
}
sort(q+1,q+cntq+1,cmp);
int l=1,r=0;
rep(i,1,cntq){
int ql=q[i].l,qr=q[i].r,qt=q[i].t;
while (l>ql) val+=!cnt[a[--l]]++;
while (r<qr) val+=!cnt[a[++r]]++;
while (l<ql) val-=!--cnt[a[l++]];
while (r>qr) val-=!--cnt[a[r--]];
while (t<qt){
++t;
if (ql<=c[t].l&&c[t].l<=qr) val-=!--cnt[a[c[t].l]]-!cnt[c[t].r]++;
swap(a[c[t].l],c[t].r);
}
while (t>qt){
if (ql<=c[t].l&&c[t].l<=qr) val-=!--cnt[a[c[t].l]]-!cnt[c[t].r]++;
swap(a[c[t].l],c[t].r);
--t;
}
ans[q[i].id]=val;
}
rep(i,1,cntq) printf("%d\n",ans[i]);
return 0;
}