萌新求助线段树合并

CF1009F Dominant Indices

听取MLE声一片 @ 2021-08-18 23:17:03

在第67个点T了,求调

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<complex>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void write(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10|'0');
}
const int N=2e6+10;
const int M=2e7+10;
int n,head[N],nex[N<<1],to[N<<1],dep[N],cnt,tot;
int a[M],id[M],root[N],lc[M],rc[M],ans[N];
inline void add(int u,int v){
    nex[++cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
}
void dfs1(int u,int fa){
    dep[u]=dep[fa]+1;
    for(int e=head[u];e;e=nex[e]){
        int v=to[e];
        if(v==fa)
            continue;   
        dfs1(v,u);
    }
}
void query(int &p,int l,int r,int x,int val){
    if(!p)
        p=++tot;
    if(l==r){
        a[p]+=val;
        id[p]=x;
        return ;
    }
    int mid=(l+r)>>1;
    if(x<=mid)
        query(lc[p],l,mid,x,val);
    else query(rc[p],mid+1,r,x,val);
    if(a[lc[p]]>=a[rc[p]]){
        a[p]=a[lc[p]];  
        id[p]=id[lc[p]];
    }
    else{
        a[p]=a[rc[p]];
        id[p]=id[rc[p]];
    }
}
int merge(int x,int y,int l,int r){
    if(!x)
        return y;
    if(!y)
        return x;
    if(l==r){
        a[x]+=a[y];
        id[x]=l;
        return x;
    }
    int mid=(l+r)>>1;
    lc[x]=merge(lc[x],lc[y],l,mid);
    rc[x]=merge(rc[x],rc[y],mid+1,r);
    if(a[lc[x]]>=a[rc[x]]){
        a[x]=a[lc[x]];
        id[x]=id[lc[x]];
    }
    else{
        a[x]=a[rc[x]];
        id[x]=id[rc[x]];    
    }   
    return x;
}
void dfs2(int u,int fa){
    query(root[u],1,n,dep[u],1);
    for(int e=head[u];e;e=nex[e]){
        int v=to[e];
        if(v==fa)
            continue;
        dfs2(v,u);  
        root[u]=merge(root[u],root[v],1,n);
    }
    ans[u]=id[root[u]]-dep[u];
}
int main()
{
    n=read();
    for(int i=1;i<n;i++){
        int u=read(),v=read();
        add(u,v);
        add(v,u);
    }
    dfs1(1,0);
    dfs2(1,0);
    for(int i=1;i<=n;i++){
        write(ans[i]);putchar('\n');
    }
    return 0;
}

|