CF1009F Dominant Indices(长链剖分)
长链剖分模板?在每个链顶开一个 vector 记录,合并链的时候每加一次更新一下这条链的答案就可以了。
不得不说 vector 的空间常数好大啊
#include<cstdio> #include<vector> #define For(i,A,B) for(i=(A);i<=(B);++i) #define Go(u) for(i=G[u];i;i=nxt[i])if((v=to[i])!=f[u]) using namespace std; const int N=1000050; const int BUF=1<<21; char rB[BUF],*rS,*rT,wB[BUF+50]; int wp=-1; inline char gc(){return rS==rT&&(rT=(rS=rB)+fread(rB,1,BUF,stdin),rS==rT)?EOF:*rS++;} inline void flush(){fwrite(wB,1,wp+1,stdout);wp=-1;} inline int rd(){ char c=gc(); while(c<48||c>57)c=gc(); int x=c&15; for(c=gc();c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c&15); return x; } short buf[15]; inline void wt(int x){ if(wp>BUF)flush(); short l=-1; while(x>9){ buf[++l]=x%10; x/=10; } wB[++wp]=x|48; while(l>=0)wB[++wp]=buf[l--]|48; wB[++wp]='\n'; } int G[N],to[N<<1],nxt[N<<1],sz,f[N],dep[N],dis[N],son[N],top[N],s[N]; vector<int> c[N]; inline void chk(int p,int dlt,int &a,int b){if(c[p][dlt+b]>c[p][dlt+a]||c[p][dlt+b]==c[p][dlt+a]&&b<a)a=b;} inline void adde(int u,int v){ to[++sz]=v;nxt[sz]=G[u];G[u]=sz; to[++sz]=u;nxt[sz]=G[v];G[v]=sz; } void dfs1(int u,int fa){ int i,v; dep[u]=dep[f[u]=fa]+1; dis[u]=1; Go(u){ dfs1(v,u); if(dis[v]+1>dis[u]){son[u]=v;dis[u]=dis[v]+1;} } } void dfs2(int u,int topf){ c[top[u]=topf].push_back(0); if(son[u]){ int i,v; dfs2(son[u],topf); Go(u)if(v!=son[u])dfs2(v,v); } } void dfs(int u){ ++c[top[u]][dep[u]-dep[top[u]]]; if(son[u]){ int i,j,v; dfs(son[u]); chk(top[u],dep[u]-dep[top[u]],s[u],s[son[u]]+1); Go(u)if(v!=son[u]){ dfs(v); For(j,0,dis[v]-1){ c[top[u]][dep[v]+j-dep[top[u]]]+=c[v][j]; chk(top[u],dep[u]-dep[top[u]],s[u],j+1); } } } } int main(){ int n=rd(),i,u,v; For(i,2,n){ u=rd();v=rd(); adde(u,v); } dfs1(1,0); dfs2(1,1); dfs(1); For(i,1,n)wt(s[i]); flush(); return 0; }