The 2025 ICPC China Zhejiang Province Programming Contest
题解:
https://files.cnblogs.com/files/clrs97/ZJCPC_2025.pdf
Code:
A. Outer LIS
#include<iostream> #include<cmath> #include<algorithm> using namespace std; const int N=100005,K=321; int n,q,m,lim,i,j,k,l,r,a[N],b[N]; int mx,f[N],g[N],pre1[N],suf1[N],bit[N],pre2[K][N],suf2[K][N],tmp[N],ans[K][K]; int at[N],st[K],en[K],pool[N]; inline void up(int&a,int b){a<b?(a=b):0;} inline void ins(int x,int p){for(;x<=n;x+=x&-x)up(bit[x],p);} inline int ask(int x){int t=0;for(;x;x-=x&-x)up(t,bit[x]);return t;} inline bool cmp(int x,int y){return a[x]<a[y];} inline int query(int l,int r){ l--,r++; if(l<1)return suf1[r]; if(r>n)return pre1[l]; int L=at[l],R=at[r]; int ret=max(ans[L-1][R+1],max(suf1[r],pre1[l])); for(int i=st[L];i<=l;i++)up(ret,f[i]+suf2[R+1][a[i]]); for(int i=en[R];i>=r;i--)up(ret,g[i]+pre2[L-1][a[i]]); int tmp=0; for(int i=st[R],ir=en[R],j=st[L],jr=en[L];i<=ir;i++){ int x=pool[i]; if(x<r)continue; while(j<=jr){ int y=pool[j]; if(a[y]>a[x])break; if(y<=l)up(tmp,f[y]); j++; } up(ret,tmp+g[x]); } return ret; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>q; for(i=1;i<=n;i++)cin>>a[i]>>b[i]; for(i=1;i<=n;i++){ f[i]=ask(a[i])+b[i]; ins(a[i],f[i]); pre1[i]=max(pre1[i-1],f[i]); } for(i=1;i<=n;i++)bit[i]=0; for(i=n;i;i--){ g[i]=ask(n-a[i]+1)+b[i]; ins(n-a[i]+1,g[i]); suf1[i]=max(suf1[i+1],g[i]); } lim=sqrt(n); for(i=1;i<=n;i++)at[i]=(i-1)/lim+1; m=at[n]; for(i=1;i<=n;i++)en[at[i]]=i; for(i=n;i;i--)st[at[i]]=i; for(i=1;i<=m;i++){ for(j=st[i];j<=en[i];j++)up(tmp[a[j]],f[j]); mx=0; for(j=1;j<=n;j++){ up(mx,tmp[j]); pre2[i][j]=mx; } } for(i=1;i<=n;i++)tmp[i]=0; for(i=m;i;i--){ for(j=st[i];j<=en[i];j++)up(tmp[a[j]],g[j]); mx=0; for(j=n;j;j--){ up(mx,tmp[j]); suf2[i][j]=mx; } } for(i=1;i<=n;i++)pool[i]=i; for(i=1;i<=m;i++){ l=st[i],r=en[i]; sort(pool+l,pool+r+1,cmp); for(j=i+2;j<=m;j++){ mx=ans[i-1][j]; for(k=l;k<=r;k++)up(mx,f[k]+suf2[j][a[k]]); ans[i][j]=mx; } } while(q--){ cin>>l>>r; cout<<query(l,r)<<"\n"; } }
B. Turn on the Light 3
#include<bits/stdc++.h> using namespace std; const int N=2e5+1e3+7; int T,n,m,vis[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>T; while(T--) { cin>>n>>m; fill(vis+1,vis+n+1,0); for(int i=1;i<=m;i++) { int x; cin>>x; if(vis[x]) cout<<"the lights are already on!\n"; else { int cnt=0; for(int j=x;j<=n;j+=x) cnt+=1-vis[j],vis[j]=1; cout<<cnt<<"\n"; } } } }
C. RDDCCD
#include<bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); static int n,q; cin>>n>>q; auto rev=[&](int x)->int { int ans=0; while(x>0) { ans=ans*10+x%10; x/=10; } return ans; }; vector<int> pd,good,contr; vector<vector<int>> a(n+5,vector<int>(n+5)),ra(n+5,vector<int>(n+5)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; ra[i][j]=rev(a[i][j]); int x=a[i][j],rx=ra[i][j]; if(i==1 and j==1) { for(int k=2;k*k<=x;k++) { if(x%k==0) { int now=k; while(x%now==0) pd.push_back(now),now*=k; now/=k; x/=now; } } if(x!=1) pd.push_back(x); for(int k=2;k*k<=rx;k++) { if(rx%k==0) { int now=k; while(rx%now==0) pd.push_back(now),now*=k; now/=k; rx/=now; } } if(rx!=1) pd.push_back(rx); sort(pd.begin(),pd.end()); pd.erase(unique(pd.begin(),pd.end()),pd.end()); good.resize(pd.size()); } else { for(int k=0;k<(int)pd.size();k++) { if(x%pd[k]==0 or rx%pd[k]==0) { good[k]++; } } } } } { auto tmp=pd;pd.clear(); for(int i=0;i<(int)tmp.size();i++) { if(good[i]==n*n-1) pd.push_back(tmp[i]); } contr.resize(pd.size()); for(int i=0;i<(int)pd.size();i++) { contr[i]=pd[i]; for(auto p:pd) { if(pd[i]!=p and pd[i]%p==0) { contr[i]=min(contr[i],pd[i]/p); } } } } static int N=n*4; struct DS { vector<int> pa,del,sz,cnt,cur; int acnt,tot; DS() { pa.resize(N+5); del.resize(N+5); sz.resize(N+5,1); cnt.resize(N+5); // cnt of (cur==del) cur.resize(N+5); acnt=tot=0; } pair<int,int> find(int x) { if(pa[x]==0) return {x,0}; auto [y,d]=find(pa[x]); del[x]^=d; pa[x]=y; return {y,del[x]}; } bool unite(int x,int y,int d) { auto [px,dx]=find(x); auto [py,dy]=find(y); if(px==py) { return (d^dx^dy)==0; } if(sz[px]<sz[py]) swap(px,py),swap(dx,dy); del[py]=dx^dy^d; sz[px]+=sz[py]; pa[py]=px; return true; } bool addedge(int x,int y,int d) { int u=x+y,v=x-y+n*3; return unite(u,v,d); } void prep() { for(int i=1;i<=N;i++) { auto [x,d]=find(i); if(d==0) { cnt[x]++; } } for(int i=1;i<=N;i++) { if(find(i).first==i) { tot++; if(cnt[i]==sz[i] or cnt[i]==0) acnt++; } } } void change(int ty,int k) // ty=0: +, ty=1: - { int u=ty?k+n*3:k; auto [pu,d]=find(u); if(cur[u]==d) { if(cnt[pu]==sz[pu]) { acnt--; } cnt[pu]--; if(cnt[pu]==0) { acnt++; } } else { if(cnt[pu]==0) { acnt--; } cnt[pu]++; if(cnt[pu]==sz[pu]) { acnt++; } } cur[u]^=1; } }; vector<DS> info(pd.size()); for(int t=0;t<(int)pd.size();t++) { int p=pd[t],flag=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]%p==0 and ra[i][j]%p==0) { //do nothing } else if(a[i][j]%p==0) { flag&=info[t].addedge(i,j,0); } else { flag&=info[t].addedge(i,j,1); } } } info[t].prep(); if(flag==0)info[t].tot=-1; } while(q--) { char op; int k,ans=1; cin>>op>>k; for(int t=0;t<(int)pd.size();t++) { if(op=='+') info[t].change(0,k); else info[t].change(1,k); if(info[t].acnt==info[t].tot) ans*=contr[t]; } cout<<ans<<"\n"; } return 0; }
D. Too Clever by Half
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+1e3+7,P=1e9+7; int T,n,c[N],s[N]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin>>T; while(T--) { cin>>n; for(int i=0;i<=n;i++) cin>>c[i]; c[0]++; s[n+1]=0; for(int i=n;i>=0;i--) s[i]=c[i]-s[i+1]; int ok=1; if(s[0]!=1) ok=0; for(int i=1;i<=n;i++) if(s[i]<=0) ok=0; if(!ok) { cout<<"Impossible\n"; continue; } string ans; for(int i=1;i<=n;i++) { for(int j=1;j<=(s[i]-1);j++) ans+='R',ans+='L'; ans+='R'; } for(int i=1;i<=n;i++) ans+='L'; cout<<ans<<"\n"; } }
E. Gold Miner
#include<bits/stdc++.h> using namespace std; #define int long long const int N=5e5+1e3+7,M=1e9+7; int qpow(int a,int b) { int ret=1; while(b) { if(b&1) ret=ret*a%M; b>>=1; a=a*a%M; } return ret; } using ll=__int128; struct P { int x,y; }p[N]; int operator ^(const P &a,const P &b) { return a.x*b.x+a.y*b.y; } int a[N],b[N],k[N]; int n,q; struct Event { int p,q,a,b; }; bool operator <(const Event &a,const Event &b) { return (ll)a.p*b.q<(ll)b.p*a.q; } bool operator ==(const Event &a,const Event &b) { return (ll)a.p*b.q==(ll)b.p*a.q; } pair<int,int> gete(P a,P b) { if(a.x>b.x) swap(a,b); return {(b^b)-(a^a),2*(b.x-a.x)}; } struct Func { int a,b,c,d; int eval(int u){return (((a*u+b)%M*u+c)%M*u+d)%M;} }; Func operator +(const Func &a,const Func &b) { return {(a.a+b.a)%M,(a.b+b.b)%M,(a.c+b.c)%M,(a.d+b.d)%M}; } Func f[N],s[N],d[N],sd[N]; int dlt[N]; int rk[N],ans[N]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y; for(int i=1;i<=q;i++) cin>>a[i]>>b[i]>>k[i]; sort(p+1,p+n+1,[&](const auto &a,const auto &b){ return a.x<b.x||(a.x==b.x&&a.y>b.y); }); vector<Event> ev; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { if(p[i].x==p[j].x) continue; auto [ax,bx]=gete(p[i],p[j]); ev.push_back({ax,bx,i,j}); } vector<Event> qr; for(int i=1;i<=q;i++) { if(a[i]!=b[i]) { qr.push_back({a[i],1,i,-1}); qr.push_back({b[i],1,i,1}); } else qr.push_back({a[i],1,i,0}); } sort(ev.begin(),ev.end()); sort(qr.begin(),qr.end()); reverse(qr.begin(),qr.end()); for(int i=1;i<=n;i++) { d[i]={0,1,(2*M-2*p[i].x)%M,(p[i]^p[i])%M}; f[i]={qpow(3,M-2),(M-p[i].x)%M,(p[i]^p[i])%M,0}; s[i]=s[i-1]+f[i]; sd[i]=sd[i-1]+d[i]; rk[i]=i; } vector<int> pos; vector<int> vis(n+1,-1); for(int i=0,j;i<ev.size();i=j+1) { while(qr.size()) { auto [p,q,x,t]=qr.back(); if((ll)p*ev[i].q>=ev[i].p) break; qr.pop_back(); if(!t) ans[x]=sd[k[x]].eval(p); else ans[x]=(ans[x]+s[k[x]].eval(p)*(M+t))%M; } int X=(ev[i].p%M+M)%M*qpow(ev[i].q,M-2)%M; j=i; while(j+1<ev.size()&&ev[i]==ev[j+1]) j++; pos.clear(); for(int k=i;k<=j;k++) { if(vis[ev[k].a]!=i) vis[ev[k].a]=i,pos.push_back(ev[k].a); if(vis[ev[k].b]!=i) vis[ev[k].b]=i,pos.push_back(ev[k].b); } sort(pos.begin(),pos.end(),[&](const auto &a,const auto &b){ return rk[a]<rk[b]; }); for(int u=0,v;u<pos.size();u=v+1) { v=u; int A=rk[pos[u]]; while(v+1<pos.size()) { int B=rk[pos[v+1]]; if(p[A].x==p[B].x&&p[A].y==p[B].y) { v++; continue; } if(p[A].x==p[B].x) break; auto [a,b]=gete(p[A],p[B]); if((ll)a*ev[i].q!=(ll)b*ev[i].p) break; v++; } int B=rk[pos[v]]; for(int z=A;z<=B;z++) dlt[z]=(f[z].eval(X)-f[A+B-z].eval(X)+M)%M; for(int z=u;z<=v;z++) rk[pos[z]]=A+B-rk[pos[z]]; reverse(p+A,p+B+1); reverse(f+A,f+B+1); reverse(d+A,d+B+1); for(int z=A;z<=B;z++) { f[z].d=(f[z].d+dlt[z])%M; s[z]=s[z-1]+f[z]; sd[z]=sd[z-1]+d[z]; } } } while(qr.size()) { auto [p,q,x,t]=qr.back(); qr.pop_back(); if(!t) ans[x]=sd[k[x]].eval(p); else ans[x]=(ans[x]+s[k[x]].eval(p)*(M+t))%M; } for(int i=1;i<=q;i++) { if(a[i]==b[i]) cout<<ans[i]<<"\n"; else cout<<ans[i]*qpow(b[i]-a[i],M-2)%M<<"\n"; } }
F. Challenge NPC III
#include<bits/stdc++.h> using namespace std; const int maxc=50,inf=0x3f3f3f3f; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int T; cin>>T; while(T--) { int n,m,k; cin>>n>>m>>k; vector<int> c(n+5); for(int i=1;i<=n;i++) { cin>>c[i]; } vector<vector<int>> G(n+5); for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; G[u].push_back(v); } int ok=1; for(int cc=1;cc<=maxc;cc++) { vector<int> dis(n+5,inf),start(n+5),dis2(n+5,inf); queue<pair<int,int>> q; for(int i=1;i<=n;i++) { if(c[i]==cc) { start[i]=i; dis[i]=0; q.emplace(i,0); } } while(not q.empty()) { auto [u,ty]=q.front();q.pop(); if(dis[u]>=k-1)break; if(ty==0) { for(auto v:G[u]) { if(dis[v]>dis[u]+1) { dis[v]=dis[u]+1; start[v]=start[u]; q.emplace(v,0); } if(dis2[v]>dis[u]+1 and start[v]!=start[u]) { dis2[v]=dis[u]+1; q.emplace(v,1); } } } else { for(auto v:G[u]) { if(dis2[v]>dis2[u]+1) { dis2[v]=dis2[u]+1; q.emplace(v,1); } } } } for(int i=1;i<=n;i++) { if(c[i]==cc and dis2[i]<=k-1) { ok=0; break; } } } if(ok)cout<<"YES\n"; else cout<<"NO\n"; } return 0; }
G. Tariff-ied
/* x>=0 1+a(x+1)/100 =(100+ax+a)/100 (100+ax+a)/(100+ax) =1+a/(100+ax) */ #include<iostream> using namespace std; typedef long long ll; const int N=45,M=10005; int Case,n,k,i,a[N],f[N],g[N],len,dot,num[M];ll U,D; inline int check(ll u,ll d){ ll low=0,high=0; for(int i=0;i<n;i++){ //a/(100+ax)>=u/d //a*d>=u*(100+ax) //a*d/u>=100+ax //ax<=a*d/u-100 //x<=d/u-100/a //x<=(d*a-100*u)/(u*a) ll A=d*a[i]-100*u,B=u*a[i]; if(A<0)continue; if(A%B==0)low--; high+=A/B+1; } low+=high; if(low>k)return 1; if(high<k)return -1; return 0; } inline void solve(){ if(check(1,1)==0){ U=D=1; return; } ll lu=0,ld=1,ru=1,rd=1,mu,md; while(1){ mu=lu+ru; md=ld+rd; int ret=check(mu,md); if(ret==0){ U=mu,D=md; break; } ll l=1,r,fin,mid; if(ret>0){//turn right while(1){ r=l<<1; if(check(lu+ru*r,ld+rd*r)>0)l=r;else break; } fin=l++;r--; while(l<=r){ ll mid=(l+r)>>1; if(check(lu+ru*mid,ld+rd*mid)>0)l=(fin=mid)+1;else r=mid-1; } lu+=ru*fin,ld+=rd*fin; }else{//turn left while(1){ r=l<<1; if(check(ru+lu*r,rd+ld*r)<0)l=r;else break; } fin=l++;r--; while(l<=r){ ll mid=(l+r)>>1; if(check(ru+lu*mid,rd+ld*mid)<0)l=(fin=mid)+1;else r=mid-1; } ru+=lu*fin,rd+=ld*fin; } } } inline void mul(int p){ for(int i=1;i<=len;i++)num[i]*=p; for(int i=1;i<=len;i++)if(num[i]>=10){ if(i==len)num[++len]=0; num[i+1]+=num[i]/10; num[i]%=10; } } void show(){ int i; for(i=len;i>dot;i--)cout<<num[i]; cout<<"."; for(;i;i--)cout<<num[i]; cout<<"\n"; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>Case; while(Case--){ cin>>n>>k; for(i=0;i<n;i++)cin>>a[i]; solve(); for(i=0;i<n;i++){ ll A=D*a[i]-100*U,B=U*a[i]; if(A<0){ f[i]=g[i]=0; continue; } f[i]=A/B+1; if(A%B==0)f[i]--,g[i]=1;else g[i]=0; k-=f[i]; } for(i=0;i<n&&k;i++)if(g[i])f[i]++,k--; len=1; num[1]=1; dot=0; for(i=0;i<n;i++){ if(!f[i])continue; mul(f[i]*a[i]+100); dot+=2; } show(); } }
H. Sweet Sugar IV
#include<iostream> #include<algorithm> #include<map> using namespace std; typedef long long ll; const int N=1000005,M=200005,Q=300005,K=5; map<int,ll>T[K];ll bit[K][M]; int n,m,lim,cob,cd,cq,i,j,x,y,z,ord[M],g[M],nxt[Q];ll ans[Q]; int id[N],dfn,dfn1[N],dfn2[N];bool vis[N]; struct P{int x,y,z;}d[M],q[Q]; inline int getid(int x,int y){return (x-1)*m+y;} void dfs1(int u){ if(vis[u]||id[u]<0)return; vis[u]=1; if(u<=lim)dfs1(u+m); if(u%m)dfs1(u+1); if(id[u]>0){ dfn++; ord[dfn]=id[u]; } dfn1[u]=dfn; } void dfs2(int u){ if(!vis[u]||id[u]<0)return; vis[u]=0; if(u%m)dfs2(u+1); if(u<=lim)dfs2(u+m); if(id[u]>0)dfn++; dfn2[u]=dfn; } inline void modify(ll*f,int x,ll p){for(;x<=cd;x+=x&-x)f[x]+=p;} inline ll ask(ll*f,int x){ll t=0;for(;x;x-=x&-x)t+=f[x];return t;} void insert(int o,int x,ll p){ if(o>=K)return; T[o][x]+=p; modify(bit[o],x,p); while(p){ map<int,ll>::iterator it=T[o].lower_bound(x+1); if(it==T[o].end())return; ll t=min(p,it->second); p-=t; insert(o+1,it->first,t); modify(bit[o],it->first,-t); if(t==it->second)T[o].erase(it);else it->second-=t; } } inline ll query(int x,int k){ ll ret=0; for(int i=0;i<k;i++)ret+=ask(bit[i],x); return ret; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>m>>cob>>cd>>cq; while(cob--){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; z=getid(x1,y1); for(i=x1;i<=x2;i++){ int k=z; for(j=y1;j<=y2;j++,k++)id[k]=-1; z+=m; } } for(i=1;i<=cd;i++){ cin>>x>>y>>z; d[i].x=x; d[i].y=y; d[i].z=z; id[getid(x,y)]=i; } lim=(n-1)*m; dfs1(1); dfn=0; dfs2(1); for(i=1;i<=cq;i++){ cin>>x>>y>>z; j=getid(x,y); x=dfn1[j]; y=dfn2[j]; nxt[i]=g[x]; g[x]=i; q[i].y=y; q[i].z=z; } for(i=1;i<=cd;i++){ j=ord[i]; insert(0,dfn2[getid(d[j].x,d[j].y)],d[j].z); for(j=g[i];j;j=nxt[j])ans[j]=query(q[j].y,q[j].z); } for(i=1;i<=cq;i++)cout<<ans[i]<<"\n"; }
I. Version Number
#include<bits/stdc++.h> #define ll long long using namespace std; vector<int>getnum(string A) { vector<int>ret; int x=0; for(auto cc:A) { if(cc=='.') ret.push_back(x),x=0; else x=x*10+(cc-'0'); } ret.push_back(x); return ret; } int main() { ios_base::sync_with_stdio(false); int Tcase; cin>>Tcase; while(Tcase--) { string A,B; cin>>A>>B; auto ai=getnum(A); auto bi=getnum(B); int ok=1; for(int i=0;i<(int)ai.size();i++) { if( ai[i]!=bi[i] ) { if(ai[i]<bi[i]) cout<<"B\n"; else cout<<"A\n"; ok=0; break; } } if(ok) cout<<"Equal\n"; } return 0; }
J. Chocolate Sweet
#include<bits/stdc++.h> using namespace std; #define int long long using pii=pair<int,int>; const int N=1e6+1e3+7; int T,n,m,q; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin>>T; while(T--) { cin>>n>>m>>q; vector<vector<int>> a(n+1,vector<int>(m+1)); vector<vector<int>> s(n+1,vector<int>(m+1)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>a[i][j]; s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; } vector<pii> qry; vector<int> ans(q); for(int i=0;i<q;i++) { int x; cin>>x; qry.push_back({x,i}); } sort(qry.begin(),qry.end()); priority_queue<pii> dlt; multiset<int> ms; for(int j=1;j<m;j++) ms.insert(n-j); vector<int> c(m+1); for(int j=1;j<=m;j++) dlt.push({-s[1][j],j}); int st=0; for(auto [qs,id]:qry) { while(dlt.size()&&-dlt.top().first<=qs) { auto [e,j]=dlt.top(); dlt.pop(); if(j<m) ms.erase(ms.find(n-c[j]-j)); c[j]++; if(j<m&&c[j]<n) ms.insert(n-c[j]-j); if(c[j]<n) dlt.push({-s[c[j]+1][j],j}); else st=max(st,j); } if(n-c[m]-m+st==0&&(!ms.size()||*ms.begin()+st>0)) ans[id]=1; } for(int i=0;i<q;i++) cout<<(ans[i]?"Putata":"Budada")<<"\n"; } } /* 2 3 3 2 1 2 1 1 1 3 1 4 2 1 5 2 2 1 1000000000 1000000000 1000000000 1000000000 0 */
K. Wavelike Finding
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const ll inf=1LL<<60; const int N=200010; int n,m,i,a[N],cut,last;ll lim,f[N]; struct DS{ int cnt,len,root,f[N],son[N][2],size[N]; ll v[N],tag[N],sum; void tag1(int x,ll p){ if(!x)return; v[x]-=p; tag[x]+=p; } void pb(int x){ if(!tag[x])return; tag1(son[x][0],tag[x]); tag1(son[x][1],tag[x]); tag[x]=0; } void up(int x){size[x]=size[son[x][0]]+size[son[x][1]]+1;} void rotate(int x){ int y=f[x],w=son[y][1]==x; son[y][w]=son[x][w^1]; if(son[x][w^1])f[son[x][w^1]]=y; if(f[y]){ int z=f[y]; if(son[z][0]==y)son[z][0]=x; if(son[z][1]==y)son[z][1]=x; } f[x]=f[y];son[x][w^1]=y;f[y]=x;up(y); } void splay(int x){ while(f[x]){ int y=f[x]; if(f[y]){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);} rotate(x); } up(x); root=x; } void init(){cnt=len=sum=0;} void append(int val){ if(!cnt){ cnt=len=root=1; f[1]=son[1][0]=son[1][1]=0; size[1]=1; sum=v[1]=1LL*m*val; tag[1]=0; return; } int x=root,w=m; while(1){ size[x]++; pb(x); int t=1LL*(w-size[son[x][0]])*val>v[x]?0:1; if(!son[x][t]){ son[x][t]=++cnt; f[cnt]=x; son[cnt][0]=son[cnt][1]=0; size[cnt]=1; splay(cnt); v[cnt]=1LL*(m-size[son[cnt][0]])*val; tag[cnt]=0; sum+=1LL*(m-size[cnt]+1)*val; tag1(son[cnt][1],val); break; } if(t)w-=size[son[x][0]]+1; x=son[x][t]; } if(len<m){ len++; return; } x=root; while(1){ pb(x); if(son[x][1])x=son[x][1];else break; } splay(x); sum-=v[x]; root=son[x][0]; f[root]=0; } ll get(){return len<m?-inf:sum;} }pre,suf; inline bool check(int l,int r){ if(r-l+1<m*2)return 0; while(last+m<=r){ pre.append(a[last]); f[last]=pre.get(); last++; } suf.init(); for(int i=r;i-m>=l;i--){ suf.append(a[i]); if(i<=r-m+1&&f[i-1]+suf.get()>=lim)return 1; } return 0; } inline void solve(){ int l=1; while(l<=n){ int bound=n-l+1; if(bound<m*2)break; pre.init(); last=l; int low=m*2; int high=m*2; while(1){ if(l+low-1+m*2>n){ if(check(l,n))cut++; return; } if(check(l,l+high-1))break; else{ if(high==bound)return; low=high+1; high=min(high*2,bound); } } int fin=high--; while(low<=high){ int mid=(low+high)/2; if(check(l,l+mid-1))high=(fin=mid)-1;else low=mid+1; } cut++; l+=fin; } } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>m>>lim; for(i=1;i<=n;i++)cin>>a[i]; solve(); cout<<cut; }
L. Nailoongs Always Lie
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 210000; int n; int a[maxn]; int vis[maxn],insta[maxn]; int t[maxn],tp; int incir[maxn]; vector<int>E[maxn]; vector<int>V[maxn]; int vn; void go(const int x) { if(insta[x]) { ++vn; int la=0; while(la!=x) { la=t[tp--]; insta[la]=0; V[vn].push_back(la); incir[la]=1; } return; } if(vis[x]) return; vis[x]=1; t[++tp]=x; insta[x]=1; go(a[x]); } int f[maxn][2]; void dp(const int x) { f[x][0]=0,f[x][1]=1; for(auto y:E[x]) if(!incir[y]) { dp(y); f[x][0]+=max(f[y][0],f[y][1]); f[x][1]+=f[y][0]; } } int g[2][2],ng[2][2]; int main() { ios_base::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; E[a[i]].push_back(i); } for(int i=1;i<=n;i++) if(!vis[i]) { while(tp) insta[t[tp--]]=0; go(i); } int ans=0; for(int i=1;i<=vn;i++) { const auto &Vi= V[i]; for(auto x:Vi) dp(x); g[0][0]= f[Vi[0]][0]; g[0][1]=g[1][0]= -n; g[1][1]= f[Vi[0]][1]; for(int j=1;j< (int)Vi.size();j++) { int x=Vi[j]; for(int k=0;k<2;k++) { ng[k][0]=max(g[k][0]+f[x][0], g[k][1]+f[x][0]); ng[k][1]=g[k][0]+f[x][1]; } memcpy(g,ng,sizeof g); } int cc=-n; for(int u=0;u<2;u++) for(int v=0;u+v<2;v++) cc=max(cc, g[u][v]); ans+=cc; } cout<<ans<<endl; return 0; }
M. Master of Both VII
#include<bits/stdc++.h> using namespace std; int qry(int u,int v) { cout<<"? "<<u<<" "<<v<<endl; int r; cin>>r; if(r==-1) exit(0); return r; } signed main() { int T; cin>>T; while(T--) { int n; cin>>n; stack<int> st; vector<pair<int,int> >ans; for(int i=3;i<=n-1;i++) { int w=qry(1,i); if(w==0) { ans.push_back({1,i}); while(st.size()) ans.push_back({st.top(),i}),st.pop(); } else { int d=w-st.size(); if(d>0) { for(int j=1;j<=d;j++) st.push(i-1); } else { for(int j=1;j<=-d;j++) ans.push_back({st.top(),i}),st.pop(); } } } while(st.size()) ans.push_back({st.top(),n}),st.pop(); cout<<"!"; for(auto [x,y]:ans) cout<<" "<<x<<" "<<y; cout<<endl; int r; cin>>r; if(r!=1) return 0; } }