70分,带修莫队,蜜汁输出0,萌新,女的,求教

P1903 [国家集训队] 数颜色 / 维护队列

@[月见之免](/space/show?uid=81372) 带修改的块大小难道不是一般是$n^{\frac{2}{3}}$么?
by ecnerwaIa @ 2019-04-29 20:56:29


@[月见之免](/space/show?uid=81372) 还有我头一次见这种排序方式...
by ecnerwaIa @ 2019-04-29 21:06:44


@[千年之狐_天才](/space/show?uid=54113) 奇偶排序?
by guodong @ 2019-04-29 21:07:40


@[月见之免](/space/show?uid=81372) 为什么奇偶排序。。。
by ecnerwaIa @ 2019-04-29 21:08:07


@[月见之免](/space/show?uid=81372) 我帮你大改动一下
by ecnerwaIa @ 2019-04-29 21:10:22


@[月见之免](/space/show?uid=81372) 改完了
by ecnerwaIa @ 2019-04-29 21:13:28


```cpp #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<map> #define ri register int using namespace std; #define N 1000010 int ans,col[N],a[N],blo[N]; inline int gi() { register char tmp=getchar(); while(tmp>'9'||tmp<'0') tmp=getchar(); ri ans=0; while(tmp<='9'&&tmp>='0') { ans=ans*10+tmp-'0'; tmp=getchar(); } return ans; } int n,m,cntq,cntc,len; struct Que{ int l,r,time,ans,pos; }q[N]; struct Cha{ int v,pos; }c[N]; bool pre(Que a1,Que b1) { if(blo[a1.l]!=blo[b1.l])return a1.l<b1.l; if(blo[a1.r]!=blo[b1.r])return a1.r<b1.r; return a1.time<b1.time; } inline void add(int pos) { if((++col[a[pos]])==1) ans++; } inline void del(int pos) { if((--col[a[pos]])==0) ans--; } inline void work(int pos,int l,int r) { int v=c[pos].v,loc=c[pos].pos; if(v==a[loc]) return; if(loc<=r&&loc>=l) { col[v]++; col[a[loc]]--; if(col[a[loc]]==0) ans--; if(col[v]==1) ans++; } swap(c[pos].v,a[loc]); } bool cmp(Que a,Que b) { return a.pos<b.pos; } signed main() { n=gi(),m=gi(); for(ri i=1;i<=n;i++) a[i]=gi(); for(ri i=1;i<=m;i++) { register char opt; scanf(" %c",&opt); if(opt=='Q') { q[++cntq].l=gi(); q[cntq].r=gi(); q[cntq].time=cntc; q[cntq].pos=cntq; } else { c[++cntc].pos=gi(); c[cntc].v=gi(); } } len=pow(n,2.0/3); for(int i=1;i<=n;++i)blo[i]=(i-1)/len+1; sort(q+1,q+cntq+1,pre); int l=0,r=0,now=0; for(ri i=1;i<=m;i++) { int ql=q[i].l,qr=q[i].r,qt=q[i].time; while(l<ql) del(l++); while(l>ql) add(--l); while(r<qr) add(++r); while(r>qr) del(r--); while(now<qt) work(++now,ql,qr); while(now>qt) work(now--,ql,qr); q[i].ans=ans; } sort(q+1,q+cntq+1,cmp); for(ri i=1;i<=cntq;i++) { printf("%d\n",q[i].ans); } } ```
by ecnerwaIa @ 2019-04-29 21:13:39


当然如果要离散话也可以,但是不是你那样离散的
by ecnerwaIa @ 2019-04-29 21:14:05


这个我晚上要打比赛,就先下了,等10:35如果有问题再问我吧
by ecnerwaIa @ 2019-04-29 21:15:05


@[千年之狐_天才](/space/show?uid=54113) thx
by guodong @ 2019-04-29 21:22:41


| 下一页