A、C、I、J出题人题解
来自讲题PPT(这一部分作者也是我)。
J:
std:
//written by Amekawa_kanade #include<bits/stdc++.h> using namespace std; void syncoff()//fuck you sync { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); } #define endl '\n' const int N=1e6+11; using ll=long long; int t,n,k,m,q; vector<int> G[N],R[N]; vector<int> T[N]; int fa[N][21],dep[N]; int asklca(int u,int v) { if(dep[u]<dep[v]) swap(u,v); for(int i=20;i>=0;--i) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i]; if(u==v) return u; for(int i=20;i>=0;--i) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i]; return fa[u][0]; } void addleaf(int u,int lf) { fa[u][0]=lf;dep[u]=dep[lf]+1;T[lf].push_back(u),T[u].push_back(lf); for(int i=1;i<=20;++i) fa[u][i]=fa[fa[u][i-1]][i-1]; } int gdi[N],ord[N],ct;ll sum[N]; void dfs(int u,int f) { sum[u]=(G[u].size()==0)?1:0; for(auto v:T[u]) { if(v==f) continue; //cout<<u<<' '<<v<<endl; dfs(v,u); sum[u]+=sum[v]; } } void solve() { cin>>n>>m;int nid=n; for(int i=1;i<=m;++i) { int iu,iv; cin>>iu>>iv;++nid; G[iu].push_back(nid);++gdi[nid]; R[nid].push_back(iu); G[nid].push_back(iv);++gdi[iv]; R[iv].push_back(nid); } stack<int> qq; qq.push(1); while(qq.size()) { int u=qq.top();qq.pop(); ord[++ct]=u; for(auto v:G[u]) { --gdi[v]; if(gdi[v]==0) qq.push(v); } } for(int i=1;i<=nid;++i) for(int j=0;j<=20;++j) fa[i][j]=1; for(int i=1;i<=ct;++i) { int u=ord[i]; if(R[u].size()) { int w=R[u][0]; for(int j=1,usz=R[u].size();j<usz;++j) w=asklca(w,R[u][j]); addleaf(u,w); } } dfs(1,0); int ans=0; for(int i=1;i<=n;++i) if(G[i].size()==1&&sum[G[i][0]]==0) ++ans; cout<<ans<<endl; } int main() { syncoff(); t=1; while(t--) solve(); return 0; }
A:
std:
//written by Amekawa_kanade #include<bits/stdc++.h> using namespace std; const int N=1e6+11; using ll=long long; using i128=__int128; int t,n,k,m,q; ll ans[N];pair<int,int> scps[N]; ll d[N],didx[N],ds[N],rcnt[N],req[N]; int ida[N],_ida[N],_idb[N]; struct opts { int l,r,ti,id,tl,tr;ll v; }; opts cs[N*5]; void solve(int l,int r,int cl,int cr,int siz,int xl,int xr) { if(cl>cr) return; if(l==r) { for(int i=cl;i<=cr;++i) ans[ida[i]]=l; return; } for(int i=0;i<=siz;++i) d[i]=didx[i]=ds[i]=0; for(int i=cl;i<=cr;++i) d[scps[ida[i]].first]=1; for(int i=xl;i<=xr;++i) d[cs[i].l]=1,d[cs[i].r]=1,d[cs[i].r+1]=1; for(int i=1;i<=siz;++i) d[i]+=d[i-1]; for(int i=cl;i<=cr;++i) scps[ida[i]].first=d[scps[ida[i]].first],didx[scps[ida[i]].first]=scps[ida[i]].second; for(int i=xl;i<=xr;++i) { cs[i].l=d[cs[i].l],cs[i].r=d[cs[i].r];didx[cs[i].l]=cs[i].tl,didx[cs[i].r]=cs[i].tr,didx[cs[i].r+1]=cs[i].tr+1; } siz=d[siz]; int mid=(l+r)/2,ptl=0,ptr=0; for(int i=0;i<=siz;++i) d[i]=0; for(int i=xl;i<=xr;++i) if(cs[i].ti<=mid) d[cs[i].l]+=cs[i].v,d[cs[i].r+1]-=cs[i].v; for(int i=1;i<=siz;++i) d[i]+=d[i-1]; for(int i=1;i<=siz;++i) ds[i]=ds[i-1]+d[i]+d[i-1]*(didx[i]-didx[i-1]-1); for(int i=cl;i<=cr;++i) { rcnt[i]=0; rcnt[i]=rcnt[i]+ds[scps[ida[i]].first]; if(rcnt[i]>=req[ida[i]]) _ida[++ptl]=ida[i]; else _idb[++ptr]=ida[i],req[ida[i]]-=rcnt[i]; } int cm=cl-1; for(int i=1;i<=ptl;++i) ida[++cm]=_ida[i]; int cd=cm; for(int i=1;i<=ptr;++i) ida[++cd]=_idb[i]; int xm=xl-1; while(xm<xr&&cs[xm+1].ti<=mid) ++xm; solve(l,mid,cl,cm,siz,xl,xm);solve(mid+1,r,cm+1,cr,siz,xm+1,xr); } pair<int,int> asks[N]; struct BIT { vector<ll> c;int _n; BIT(int _n):_n(_n) { c=vector<ll>(_n+3,0); } void add(int x,ll v) { while(x<=_n) c[x]+=v,x+=(x&(-x)); } ll sum(int x) { ll ret=0; while(x>0) ret+=c[x],x-=(x&(-x)); return ret; } ll ask(int l,int r) { if(r<l) return 0; return sum(r)-sum(l-1); } }; int dq[N],ctr; #define gc getchar_unlocked inline ll qread() { ll x=0,f=1;char c=gc(); while(c<'0' || c>'9') f=(c=='-'?-1:1),c=gc(); while(c>='0' && c<='9') x=x*10+c-'0',c=gc(); return x*f; } inline void qwrite(ll x,char ed='\n') { if(!x) {putchar('0'),putchar(ed);return;} char w[44];ll cnt=0; if(x<0) putchar('-'),x=-x; while(x) w[++cnt]=(x%10)+'0',x/=10;++cnt; while(--cnt) putchar(w[cnt]);putchar(ed); } void solve() { n=qread();m=qread();BIT cx(n+1); for(int i=1;i<=n;++i) scps[i]=(make_pair(i,i)); for(int i=1;i<=n;++i) req[i]=qread(),ida[i]=i; int cnt=0; for(int i=1;i<=m;++i) { int opt; int il,ir; opt=qread();il=qread();ir=qread(); if(opt==1) { int mid=(il+ir)/2;ll sp1=mid-il+1; cs[++cnt]={il,il,i,cnt,il,il,sp1}; if(mid>il) cs[++cnt]={il+1,mid,i,cnt,il+1,mid,-1}; cs[++cnt]={mid+1,mid+1,i,cnt,mid+1,mid+1,-1}; cs[++cnt]={mid+1,ir,i,cnt,mid+1,ir,1}; cs[++cnt]={ir+1,ir+1,i,cnt,ir+1,ir+1,mid-ir}; } else { asks[i]=make_pair(il,ir); } } solve(1,m+1,1,n+1,n+1,1,cnt); for(int i=1;i<=n;++i) dq[i]=i;ctr=1; sort(dq+1,dq+n+1,[](int x,int y){return ans[x]<ans[y];}); for(int i=1;i<=m;++i) { while(ctr<=n&&ans[dq[ctr]]<=i) { cx.add(dq[ctr],1);++ctr; } if(asks[i].first==0) continue; int x=asks[i].first,y=asks[i].second; qwrite(cx.ask(x,y)); } } int main() { solve(); return 0; }
I:
std:
//written by Amekawa_kanade #include<bits/stdc++.h> using namespace std; void syncoff()//fuck you sync { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); } #define endl '\n' const int N=5e5+11; using ll=long long; int t,n,k,m,q; int dd[N*2],d1[N],d2[N]; void manacher(string s) { vector<char> ss;int _n; ss.push_back('^'),ss.push_back('$'); for(auto x:s) ss.push_back(x),ss.push_back('$'); _n=ss.size();//dd[1]=1; for(int i=1,l=1,r=0;i<=_n;++i) { int p=(i>r)?(1):(min(r-i+1,dd[l+r-i])); while(i+p-1<=_n&&i-p+1>=1&&ss[i-p+1]==ss[i+p-1]) ++p; --p;dd[i]=p;if(i+p-1>r) r=i+p-1,l=i-p+1; } for(int i=2;i<=_n-1;++i) if(i&1) d2[(i-1)/2]=(dd[i]-1)/2; else d1[i/2]=dd[i]/2; } bool pp[N],ps[N]; int qp[N],qs[N],qpsz,qssz; void clr() { for(int i=1;i<=n;++i) d1[i]=d2[i]=0,pp[i]=ps[i]=0; for(int i=1;i<=2*n+3;++i) dd[i]=0; qpsz=0,qssz=0; } ll getans(string ss) { manacher(ss); pp[1]=ps[n]=1; for(int i=2;i<=n;++i) { int px=(i/2)+(i&1); if(i&1) { if(d1[px]>=px) pp[i]=1; else pp[i]=0; } else { if(d2[px]>=px) pp[i]=1; else pp[i]=0; } } for(int i=n-1;i>=1;--i) { int halfl=(n-i+1)/2+((n-i+1)&1); int px=i+halfl-1; if((n-i+1)&1) { if(d1[px]>=halfl) ps[i]=1; else ps[i]=0; } else { if(d2[px]>=halfl) ps[i]=1; else ps[i]=0; } } qp[++qpsz]=0; for(int i=1;i<=n;++i) { if(pp[i]) qp[++qpsz]=i; if(ps[i]) qs[++qssz]=i; } qs[++qssz]=n+1; ll ans=1e18; int qpt=1,qst=1; while(qpt<=qpsz) { while(qst<qssz&&qp[qpt]>=qs[qst]) ++qst; if(qp[qpt]==0) { ans=min(ans,1ll+(qs[qst]-1ll)); } else if(qs[qst]==n+1) { int pos=qp[qpt]+1; if(pos>n) { ans=min(ans,1ll); } else break; } else { int lp=qp[qpt]+1,rp=qs[qst]-1; if(lp>rp) { if(ps[1]) ans=min(1ll,ans); else ans=min(0ll,ans); } else { int nlen=n+(rp-lp+1); if(nlen&1) { ans=min(ans,rp-lp+1ll); } else { ans=min(ans,rp-lp+1ll); } } } ++qpt; } clr();return ans; } void solve() { string s; cin>>s;n=s.length(); if(n==1) { cout<<1<<endl; return clr(); } string rs=s;reverse(rs.begin(),rs.end()); ll ans=min(getans(s),getans(rs)); cout<<ans<<endl; } int main() { t=1; cin>>t; while(t--) solve(); return 0; }
C:
std:
//written by Amekawa_kanade #include<bits/stdc++.h> using namespace std; void syncoff()//fuck you sync { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); } #define endl '\n' const int N=7e5+11; using ll=long long; int t,n,k,m,q; vector<int> G[N]; ll f[N],g[N]; ll a[N],b[N],c[N]; int ndl[N],ndr[N]; bool vis[N]; void dfs(int u,int ff) { vis[u]=1; g[u]+=(b[u]-c[u]); bool ok=0;ll dlt=1e18; ll fprod=0,fprod0=0; for(auto v:G[u]) { if(v==ff) continue; dfs(v,u); g[u]+=g[v]; ll prod=max(f[v],g[v]); dlt=min(dlt,max(f[v],g[v])-min(f[v],g[v])); if(f[v]>=g[v]) ok|=1; fprod+=prod; } fprod0=fprod;fprod0+=b[u]; if(!ok) fprod0-=dlt; f[u]=max(fprod0,fprod); } stack<int> stk0; int mambaout[N]; void clr() { while(stk0.size()) stk0.pop(); for(int i=1;i<=n;++i) G[i].clear(),f[i]=g[i]=vis[i]=0; for(int i=1;i<=n;++i) a[i]=b[i]=c[i]=ndl[i]=ndr[i]=0; } void solve() { cin>>n;ll ans=0,prep=0; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<=n;++i) cin>>b[i]; for(int i=1;i<=n;++i) cin>>c[i],prep+=c[i]; stack<int> stk; for(int i=n;i>=1;--i) { ndl[i]=i; while(stk.size()&&a[stk.top()]<=a[i]) stk.pop(); if(!stk.size()) ndr[i]=n; else ndr[i]=stk.top()-1; stk.push(i); } for(int i=1;i<=n;++i) { if(stk0.size()) { int u=stk0.top(); G[u].push_back(i); G[i].push_back(u); } stk0.push(i);++mambaout[ndr[i]]; while(mambaout[i]) stk0.pop(),--mambaout[i]; } for(int i=1;i<=n;++i) { if(vis[i]) continue; dfs(i,0);ans+=max(f[i],g[i]); } cout<<ans+prep<<endl; return clr(); } int main() { syncoff(); solve(); return 0; }