1. 程式人生 > >[國家集訓隊]數顏色

[國家集訓隊]數顏色

傳送門 帶修改的莫隊與普通的莫隊相比就是加入了一個時間指標,在排序時也要加入第三關鍵字。 還有就是塊的大小不再是n了。

#include<bits/stdc++.h>
#define il inline
using namespace std;
const int N=50005;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
il int read(){
    int
x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=(x+(x<<2)<<1)+c-48; return x*f; } il bool cread(){ char c=getchar(); for(;!isalpha(c);c=getchar()); return c=='Q'; } char sr[1<<21],z[20];int C=-1,Z; il void
Ot(){fwrite(sr,1,C+1,stdout),C=-1;} il void print(int x){ if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x; while(z[++Z]=x%10+48,x/=10); while(sr[++C]=z[Z],--Z);sr[++C]='\n'; } int n,m,k,q,s,a[N],b[N],bl[N],rc[N],rpre[N],rnew[N]; int t,cur,cnt[1000005],ans[N]; struct A{ int id,l,r,t; }Q[N]; il bool
cmp(A a,A b){return bl[a.l]==bl[b.l]?(bl[a.r]==bl[b.r]?((bl[a.r]&1)^(a.t<b.t)):((bl[a.l]&1)^(a.r<b.r))):a.l<b.l;} il void ins(int u){if(cnt[a[u]]++==0) ++cur;} il void del(int u){if(--cnt[a[u]]==0) --cur;} int main(){ n=read(),q=read(); for(int i=1;i<=n;++i) a[i]=b[i]=read(); while(q--) cread()?(Q[++m].id=m,Q[m].l=read(),Q[m].r=read(),Q[m].t=k):(rc[++k]=read(),rpre[k]=b[rc[k]],rnew[k]=b[rc[k]]=read()); s=pow(1.0*n*(k+1),1.0/3); for(int i=1;i<=n;++i) bl[i]=(i-1)/s+1; sort(Q+1,Q+m+1,cmp); for(int i=1,l=1,r=0;i<=m;++i){ while(l<Q[i].l) del(l++); while(l>Q[i].l) ins(--l); while(r<Q[i].r) ins(++r); while(r>Q[i].r) del(r--); while(t<Q[i].t){ ++t; if(l<=rc[t]&&rc[t]<=r) del(rc[t]); a[rc[t]]=rnew[t]; if(l<=rc[t]&&rc[t]<=r) ins(rc[t]); } while(t>Q[i].t){ if(l<=rc[t]&&rc[t]<=r) del(rc[t]); a[rc[t]]=rpre[t]; if(l<=rc[t]&&rc[t]<=r) ins(rc[t]); --t; }ans[Q[i].id]=cur; } for(int i=1;i<=m;++i) print(ans[i]); Ot();return 0; }