[CF708C]Centroids
来源:互联网 发布:java bigdecimal 加1 编辑:程序博客网 时间:2024/05/29 04:51
708C:Centroids
题意简述
给你一棵
现在求每个点进行这种操作之后是否可能成为重心,即所有子树大小都不超过
数据范围
思路
考虑某一个结点
注意到一个重要的性质,一个结点
那么肯定是
那么树形DP。
设
设
设
设
设
转移什么的看代码吧…
特别麻烦= =
代码
#include<cstdio>#include<cstring>#include<iostream>using namespace std;struct edge{ int s,t,next;}e[800010];int head[400010],cnt;void addedge(int s,int t){ e[cnt].s=s;e[cnt].t=t;e[cnt].next=head[s];head[s]=cnt++; e[cnt].s=t;e[cnt].t=s;e[cnt].next=head[t];head[t]=cnt++;}int n,u,v,siz;int son[400010],size[400010],f[400010],se[400010],pos[400010],fa[400010],g[400010];bool ok[400010];void dfs(int node,int lastfa){ fa[node]=lastfa; size[node]=1; son[node]=0; for (int i=head[node];i!=-1;i=e[i].next) if (e[i].t!=lastfa) { dfs(e[i].t,node); size[node]+=size[e[i].t]; if (size[e[i].t]>size[son[node]]) son[node]=e[i].t; if (size[e[i].t]<=n/2) { if (size[e[i].t]>f[node]) { se[node]=f[node]; f[node]=size[e[i].t]; pos[node]=e[i].t; } else if (size[e[i].t]>se[node]) se[node]=size[e[i].t]; } else if (f[e[i].t]>f[node]) { se[node]=f[node]; f[node]=f[e[i].t]; pos[node]=e[i].t; } else if (f[e[i].t]>se[node]) se[node]=f[e[i].t]; } if (n-size[node]>size[son[node]]) son[node]=lastfa;}void dfs2(int node,int lastfa){ for (int i=head[node];i!=-1;i=e[i].next) if (e[i].t!=lastfa) { if (n-size[e[i].t]<=n/2) g[e[i].t]=max(g[e[i].t],n-size[e[i].t]); g[e[i].t]=max(g[e[i].t],g[node]); if (pos[node]==e[i].t) g[e[i].t]=max(g[e[i].t],se[node]); else g[e[i].t]=max(g[e[i].t],f[node]); dfs2(e[i].t,node); }}int main(){ scanf("%d",&n); memset(head,0xff,sizeof(head)); cnt=0; for (int i=1;i<n;i++) { scanf("%d%d",&u,&v); addedge(u,v); } dfs(1,1); dfs2(1,1); for (int i=1;i<=n;i++) if (son[i]==fa[i]) ok[i]=(n-size[i]-g[i]<=n/2); else ok[i]=(size[son[i]]-f[i]<=n/2); for (int i=1;i<=n;i++) printf("%d ",ok[i]); return 0;}
0 0
- [CF708C]Centroids
- CF708C:Centroids(树形dp & 重心构造判断)
- 重心-[Codeforces709E] Centroids
- 【Codeforces708C】【树形dp】【贪心】Centroids
- 【CF 708C】Centroids(树型DP)
- Codeforces 708C Centroids(树形dp)
- 树形dp(Centroids,cf 708C)
- CF 708C. Centroids 树形dp
- AIM Tech Round 3 (Div. 1) C. Centroids(树形DP)
- AIM Tech Round 3 (Div. 1)-C. Centroids
- CodeForces AIM Tech Round 3 (Div. 1) 题解(CF708A,CF708B,CF708C,CF708D,CF708E)
- AIM Tech Round 3 (Div. 2) E. Centroids (树形dp)
- AIM Tech Round 3 (Div. 1) C. Centroids(树形dp)
- AIM Tech Round 3 (Div. 2) E. Centroids (树形dp) ★ ★ ★
- AIM Tech Round 3 (Div. 1) C. Centroids(每个点能否删掉一条边再添加一条边使得这个点成为重心)
- JavaScript基础_13事件绑定函数+监听函数+冒泡事件流
- 盒模型--边界
- fragment 调用startActivityForResult 问题
- javaScript实例
- ICESat-2以及MABEL数据相关
- [CF708C]Centroids
- Oracle11g bbed install and example
- DNA序列
- emmet用法
- 2016普级组模拟试题(20161114) 平台
- NOIP2016提高A组集训第16场11.15 总结
- Vuex速学篇:(1)基本套路
- HTML常用标签整理(k类)
- 第k大的数