孱弱被卡常???只有50分

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

口胡cmp的锅 r排反了?
by UnyieldingTrilobite @ 2020-03-05 07:41:14


确实这题卡常。。。
by Fatalis_Lights @ 2020-03-05 07:50:35


@[帅气伙小](/user/155626) 本题的块大小不是$O(n^\frac{2}{3})$,而是$O((n+Q)^\frac{2}{3})$
by Smile_Cindy @ 2020-03-05 08:25:25


@[帅气伙小](/user/155626) 好吧块开4000还是救不了你, 给你看下我的代码吧 ```cpp #include <bits/stdc++.h> #define endl '\n' using namespace std; const int MAX_N=150000,MAX_M=1000005,B=4000; int res[MAX_N],n,m; int A[MAX_N],last[MAX_N]; int cnt[MAX_M]; struct node { int bl,l,br,r,t,id; }q[MAX_N]; int cnt_q; bool operator < (node p1,node p2) { return p1.bl<p2.bl || p1.bl==p2.bl && p1.br<p2.br || p1.bl==p2.bl && p1.br==p2.br && p1.t<p2.t; } int from[MAX_N],to[MAX_N],pos[MAX_N],cnt_c; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++)cin>>A[i]; for(int i=1;i<=n;i++)last[i]=A[i]; for(int i=1;i<=m;i++) { string opt; cin>>opt; if(opt=="Q") { int l,r; cin>>l>>r; cnt_q++; q[cnt_q].id=cnt_q; q[cnt_q].l=l; q[cnt_q].r=r; q[cnt_q].bl=l/B; q[cnt_q].br=r/B; q[cnt_q].t=cnt_c; } else { int x,y; cin>>x>>y; cnt_c++; pos[cnt_c]=x; from[cnt_c]=last[x]; to[cnt_c]=y; last[x]=y; } } sort(q+1,q+cnt_q+1); int ans=0; int l=q[1].l,r=q[1].r,t=q[1].t; for(int i=1;i<=t;i++)A[pos[i]]=to[i]; for(int i=l;i<=r;i++) { cnt[A[i]]++; ans+=(cnt[A[i]]==1); } for(int i=1;i<=cnt_q;i++) { int ql=q[i].l,qr=q[i].r,qt=q[i].t; while(t<qt) { t++; A[pos[t]]=to[t]; if(pos[t]>=l && pos[t]<=r) { ans-=(cnt[from[t]]--==1); ans+=(cnt[to[t]]++==0); } } while(t>qt) { A[pos[t]]=from[t]; if(pos[t]>=l && pos[t]<=r) { ans-=(cnt[to[t]]--==1); ans+=(cnt[from[t]]++==0); } t--; } while(l>ql)ans+=(++cnt[A[--l]]==1); while(r<qr)ans+=(++cnt[A[++r]]==1); while(l<ql)ans-=(cnt[A[l++]]--==1); while(r>qr)ans-=(cnt[A[r--]]--==1); res[q[i].id]=ans; } for(int i=1;i<=cnt_q;i++)cout<<res[i]<<endl; return 0; } ```
by Smile_Cindy @ 2020-03-05 08:27:36


@[Alpha](/user/87058) 排序的问题,真的玄学问题
by 老咸鱼了 @ 2020-03-05 14:50:51


|