Codeforces708C Centroids 【树形dp】
题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2?
题解:树形dp,两遍dfs,第一遍dfs求得以各个结点为根的子树的结点数,以及各个结点下面切掉某条边后最多可切出多少个结点;
第二遍dfs求得每个结点上面切掉某条边后最多可切出多少个结点。
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
typedef long long ll;
const int N = 4e5+;
vector<int> ve[N];
int num[N], maxson[N], down[N], up[N];
int n;
void gmax(int& a, int b){ if(a < b) a = b;}
void dfs(int x, int fa){
// printf("dfs x %d, fa %d\n", x, fa);
num[x] = ;
down[x] = maxson[x] = ;
for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y == fa) continue ;
dfs(y, x);
num[x] += num[y];
gmax(down[x], num[y] <= n/? num[y]: down[y]);
gmax(maxson[x], num[y]);
}
}
multiset<int>::iterator it;
void dfs2(int x, int fa){
// printf("dfs2 x %d, fa %d\n", x, fa);
multiset<int> se;
for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y != fa) se.insert( num[y] <= n/? num[y]:down[y] );
} for(int i = ; i < ve[x].size(); i++){
int y = ve[x][i];
if(y != fa){
if(n-num[y] <= n/)
up[y] = n-num[y];
else {
it = se.find( num[y] <= n/? num[y]:down[y] );
se.erase(it);
gmax(up[y], up[x]);
if(!se.empty())
gmax(up[y], *se.rbegin());
se.insert( num[y] <= n/? num[y]:down[y] );
}
dfs2(y, x);
}
}
} int main(){
int u, v; scanf("%d", &n);
for(int i = ; i < n; i++){
scanf("%d%d", &u, &v);
ve[u].push_back(v), ve[v].push_back(u);
}
dfs(, -);
dfs2(, -);
bool tag;
// for(int i = 1; i <= n; i++)
// cout << maxson[i] << ' ' << num[i] << ' ' << down[i] << ' ' << up[i] << endl;
for(int i = ; i <= n; i++){
if(maxson[i] <= n/&&n-num[i] <= n/)//不用切
tag = true;
else if(n-num[i] > n/)//要切上面
tag = n-num[i]-up[i] <= n/;
else//要切下面
tag = maxson[i]-down[i] <= n/;
putchar(tag+'');
putchar(i == n? '\n':' ');
}
return ;
}
Codeforces708C Centroids 【树形dp】的更多相关文章
- codeforces 709E E. Centroids(树形dp)
题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...
- Codeforces 709E. Centroids 树形DP
题目链接:http://codeforces.com/contest/709/problem/E 题意: 给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心 题 ...
- CF708C Centroids(树形DP)
发现变重心就是往重心上割,所以\(\text{up and down}\),一遍统计子树最大\(size\),一遍最优割子树,\(down\),\(up\)出信息,最后\(DFS\)出可行解 #inc ...
- Codeforces-708C(树形DP)
一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...
- AIM Tech Round 3 (Div. 1) (构造,树形dp,费用流,概率dp)
B. Recover the String 大意: 求构造01字符串使得子序列00,01,10,11的个数恰好为$a_{00},a_{01},a_{10},a_{11}$ 挺简单的构造, 注意到可以通 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- C#:关联程序和文件
一.关联代码 /// <summary> /// 关联程序和类型 /// </summary> private void RegFileExt() { try { string ...
- ACM题目————STL练习之Ananagrams
Description Most crossword puzzle fans are used to anagrams--groups of words with the same letters i ...
- YTU 2989: 顺序表基本运算(线性表)
2989: 顺序表基本运算(线性表) 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 题目描述 编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char), ...
- 【20160924】GOCVHelper综述
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- Oracle数据库的启动与停止
oracle linux下开启与关闭 .启动ORACLE监听 首先要登录用户oracle:su - oracle oracle@localhost bin]$ lsnrctl --启动oracle监听 ...
- JAVA获取密钥公钥的keytool的使用
一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...
- 如何实现百度外卖APP个人中心头像"浪"起来的动画效果
作为一个中午下班不肯离开工作岗位且勤奋工作的骚年来说,叫外卖就成了不可或缺的习惯.某日瞬间发现百度外卖的APP波浪效果很是吸引人.相比较其他的外卖APP,颜值略高些.(淘宝也有波浪的效果),遂就思考如 ...
- 静态方法和类成员方法(Python)
静态方法和成员方法分别在创建时分别被装入Staticmethod 类型和 Classmethod类型的对象中.静态方法的定义没有 self参数,且能够被类本身直接调用,类方法在定义时需要名为 cls的 ...
- android 介绍0
Android (src res maifest) src ==>pacege==>类(后台代码) layout ==>界面 value ==>字符串 R类:layout ...
- 是否用new来新建对象
class A{ }: 1.不使用new来新建对象 A a: 使用完后什么也不用做,系统自动调用析构函数.使用空间是栈. 2.使用new来新建对象 A* a=new A(); delete a;/ ...