Codeforces 708C Centroids(树形dp)
来源:互联网 发布:淘宝眼镜店推荐知乎 编辑:程序博客网 时间:2024/05/17 22:18
代码:
#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
- Codeforces 708C Centroids(树形dp)
- 树形dp(Centroids,cf 708C)
- CF 708C. Centroids 树形dp
- 【CF 708C】Centroids(树型DP)
- AIM Tech Round 3 (Div. 1) C. Centroids(树形dp)
- AIM Tech Round 3 (Div. 1) C. Centroids(树形DP)
- 【Codeforces708C】【树形dp】【贪心】Centroids
- Codeforces 708C 树形DP
- CF708C:Centroids(树形dp & 重心构造判断)
- 【CodeForces 767C】Garland (树形DP)
- AIM Tech Round 3 (Div. 2) E. Centroids (树形dp)
- AIM Tech Round 3 (Div. 2) E. Centroids (树形dp) ★ ★ ★
- Codeforces 77C 树形DP
- Codeforces 767C 树形dp
- Codeforces 455C Civilization(并查集+树形dp)
- Codeforces 855 C. Helga Hufflepuff’s Cup (树形dp)
- CodeForces 855C Helga Hufflepuff's Cup(树形dp)
- codeforces 855C Helga Hufflepuff's Cup (树形dp)
- adjacent adj. 相邻; 邻近的,毗邻的; (时间上) 紧接着的;
- mysql数据库启动报错Starting MySQL.The server quit without updating PID file..
- C#解决引用第三方dll没有强签名问题
- Spring-Boot中如何使用多线程处理任务
- Xml 主页
- Codeforces 708C Centroids(树形dp)
- 较详细的介绍JNI
- Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台
- 威佐夫博弈基础
- JavaScript学习笔记---------(三)
- 处理文件上传使用base64
- Linker script in Linux(什么是链接脚本 )
- java基础学习总结——浅谈为什么一个java源文件中只能有一个public类
- Java系列之Date、Number格式化工具类