Codeforces 708C Centroids(树形dp)

来源:互联网 发布:淘宝眼镜店推荐知乎 编辑:程序博客网 时间:2024/05/17 22:18


dpdfs

使n/2

使n/2
n/2
dfsn/2
n/2n/2
dfsumaxv
imax(pre[i1],suf[i+1])
u
5debugdfs
dfsvector


代码:

#include <map>#include <set>#include <ctime>#include <stack>#include <queue>#include <cmath>#include <bitset>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define   MAX           400005#define   MAXN          1000005#define   maxnode       205#define   sigma_size    26#define   lson          l,m,rt<<1#define   rson          m+1,r,rt<<1|1#define   lrt           rt<<1#define   rrt           rt<<1|1#define   middle        int m=(r+l)>>1#define   LL            long long#define   ull           unsigned long long#define   mem(x,v)      memset(x,v,sizeof(x))#define   lowbit(x)     (x&-x)#define   pii           pair<int,int>#define   bits(a)       __builtin_popcount(a)#define   mk            make_pair#define   limit         10000//const int    prime = 999983;const int    INF   = 0x3f3f3f3f;const LL     INFF  = 0x3f3f;const double pi    = acos(-1.0);const double inf   = 1e18;const double eps   = 1e-4;const LL    mod    = 1e9+7;const ull    mx    = 133333331;/*****************************************************/inline void RI(int &x) {      char c;      while((c=getchar())<'0' || c>'9');      x=c-'0';      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/ struct Edge{    int v,next;}edge[MAX*2];int head[MAX];int num[MAX];int maxv[MAX];int tot;int n;int up[MAX],down[MAX];void init(){    mem(head,-1);    tot=0;}void add_edge(int a,int b){    edge[tot]=(Edge){b,head[a]};    head[a]=tot++;}void dfs1(int u,int fa){    num[u]=1;    maxv[u]=0;    up[u]=0;    down[u]=1;    for(int i=head[u];i!=-1;i=edge[i].next){        int v=edge[i].v;        if(v==fa) continue;        dfs1(v,u);        num[u]+=num[v];        maxv[u]=max(maxv[u],maxv[v]);        if(num[v]>n/2){            if(num[v]-maxv[v]>n/2) down[u]=0;        }    }    if(num[u]<=n/2) maxv[u]=num[u];}void dfs2(int u,int fa,int d){    int cnt=0;    vector<int> st;    st.push_back(0);    for(int i=head[u];i!=-1;i=edge[i].next){        int v=edge[i].v;        if(v==fa) continue;        st.push_back(v);        cnt++;    }    vector<int> pre(cnt+5),suf(cnt+5);    for(int i=1;i<=cnt;i++) pre[i]=max(pre[i-1],maxv[st[i]]);    for(int i=cnt;i>0;i--) suf[i]=max(suf[i+1],maxv[st[i]]);    for(int i=1;i<=cnt;i++){        if(n-num[st[i]]<=n/2){            up[st[i]]=1;        }        else{            if(n-num[st[i]]-max(max(pre[i-1],suf[i+1]),d)<=n/2) up[st[i]]=1;        }    }    for(int i=1;i<=cnt;i++){        int k=d;        k=max(max(pre[i-1],suf[i+1]),k);        if(n-num[st[i]]<=n/2) k=max(k,n-num[st[i]]);        dfs2(st[i],u,k);    }}int main(){    while(cin>>n){        init();        for(int i=1;i<n;i++){            int a,b;            scanf("%d%d",&a,&b);            add_edge(a,b);            add_edge(b,a);        }        dfs1(1,-1);        up[1]=1;        dfs2(1,-1,0);        for(int i=1;i<=n;i++){            if(up[i]&&down[i]) printf("1");            else printf("0");            if(i==n) printf("\n");            else printf(" ");        }    }    return 0;}
0 0
原创粉丝点击