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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/sunshine-chen/p/12597807.html