发现变重心就是往重心上割,所以\(\text{up and down}\),一遍统计子树最大\(size\),一遍最优割子树,\(down\),\(up\)出信息,最后\(DFS\)出可行解

  1. #include <cstring>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <numeric>
  7. #define R(a,b,c) for(register int a = (b); a <= (c); ++a)
  8. #define nR(a,b,c) for(register int a = (b); a >= (c); --a)
  9. #define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))
  10. #define MP make_pair
  11. #ifdef QWQ
  12. #define D_e_Line printf("\n------\n")
  13. #define D_e(x) cerr << (#x) << " " << x << endl
  14. #define C_e(x) cout << (#x) << " " << x << endl
  15. #define FileOpen() freopen("in.txt", "r", stdin)
  16. #define FileSave() freopen("out.txt", "w", stdout)
  17. #define Pause() system("pause")
  18. #include <cassert>
  19. #define PASS fprintf(stderr, "Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
  20. #else
  21. #define D_e_Line
  22. #define D_e(x)
  23. #define C_e(x)
  24. #define FileOpen()
  25. #define FileSave()
  26. #define Pause()
  27. #define PASS
  28. #endif
  29. using namespace std;
  30. struct FastIO {
  31. template<typename ATP> inline FastIO& operator >> (ATP &x) {
  32. x = 0; int sign = 1; char c;
  33. for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') sign = -1;
  34. while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
  35. if(sign == -1) x = -x;
  36. return *this;
  37. }
  38. } io;
  39. template<typename ATP> inline ATP Max(ATP x, ATP y) {
  40. return x > y ? x : y;
  41. }
  42. template<typename ATP> inline ATP Min(ATP x, ATP y) {
  43. return x < y ? x : y;
  44. }
  45. template<typename ATP> inline ATP Abs(ATP x) {
  46. return x < 0 ? -x : x;
  47. }
  48. #include <vector>
  49. const int N = 4e5 + 7;
  50. vector<int> G[N];
  51. int siz[N], maxSize[N], pos[N], down[N], up[N], n, halfSize;
  52. inline void DFS_First(int u, int father) {
  53. siz[u] = 1, maxSize[u] = 0;
  54. for(auto v : G[u]){
  55. if(v == father) continue;
  56. DFS_First(v, u);
  57. siz[u] += siz[v];
  58. maxSize[u] = Max(maxSize[u], siz[v]);
  59. }
  60. maxSize[u] = Max(maxSize[u], n - siz[u]);
  61. }
  62. inline void DFS_WhichBigger(int u, int father) {
  63. for(auto v : G[u]){
  64. if(v == father || siz[v] < halfSize) continue;
  65. pos[u] = v;
  66. DFS_WhichBigger(v, u);
  67. }
  68. }
  69. inline void Down(int u, int father) {
  70. for(auto v : G[u]){
  71. if(v == father) continue;
  72. Down(v, u);
  73. down[u] = Max(down[u], down[v]);
  74. }
  75. if(siz[u] <= halfSize)
  76. down[u] = siz[u];
  77. }
  78. inline void Up(int u, int father) {
  79. pair<int,int> fir(0, 0), sec(0, 0);
  80. for(auto v : G[u]){
  81. if(v == father) continue;
  82. if(down[v] > fir.first){
  83. sec = fir, fir = MP(down[v], v);
  84. }
  85. else if(down[v] > sec.first){
  86. sec = MP(down[v], v);
  87. }
  88. }
  89. for(auto v : G[u]){
  90. if(v == father) continue;
  91. up[v] = Max(up[u], v == fir.second ? sec.first : fir.first);
  92. if(n - siz[v] <= halfSize){
  93. up[v] = Max(up[v], n - siz[v]);
  94. }
  95. Up(v, u);
  96. }
  97. }
  98. bool ans[N];
  99. inline void DFS_Second(int u, int father) {
  100. if(maxSize[u] <= halfSize) ans[u] = true;
  101. else{
  102. if(pos[u]){
  103. ans[u] = (siz[pos[u]] - down[pos[u]] <= halfSize);
  104. }
  105. else{
  106. ans[u] = (n - siz[u] - up[u] <= halfSize);
  107. }
  108. }
  109. for(auto v : G[u]){
  110. if(v == father) continue;
  111. DFS_Second(v, u);
  112. }
  113. }
  114. int main() {
  115. FileOpen();
  116. io >> n;
  117. halfSize = n >> 1;
  118. R(i,2,n){
  119. int u, v;
  120. io >> u >> v;
  121. G[u].emplace_back(v);
  122. G[v].emplace_back(u);
  123. }
  124. DFS_First(1, 1);
  125. DFS_WhichBigger(1, 1);
  126. Down(1, 1);
  127. Up(1, 1);
  128. DFS_Second(1, 0);
  129. R(i,1,n) printf("%d ", ans[i]);
  130. return 0;
  131. }

CF708C Centroids(树形DP)的更多相关文章

  1. codeforces 709E E. Centroids(树形dp)

    题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

  2. Codeforces 709E. Centroids 树形DP

    题目链接:http://codeforces.com/contest/709/problem/E 题意: 给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心 题 ...

  3. Codeforces708C Centroids 【树形dp】

    题目链接 题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2? 题解:树形dp,两遍dfs,第一遍df ...

  4. 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}$ 挺简单的构造, 注意到可以通 ...

  5. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  6. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  7. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  8. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  9. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

随机推荐

  1. 【freertos】012-事件标志概念和实现细节

    目录 前言 12.1 实现事件机制的预备知识 12.1.1 守护任务 12.1.2 事件的不确定性 12.1.3 事件组的报文 12.2 事件概念 12.3 事件用途参考 12.4 事件实现原理简述 ...

  2. c++ RMQ

    关于 RMQ ,即 Range Maxnum (Minnum) Query .用于查询静态区间最大(最小)值, 思路基于动态规划 (DP) 思路 设 F[i][j] 为 [i,i+2j] 区间内的的最 ...

  3. 1.设计模式第一步-《设计模式从头到脚舔一遍-使用C#实现》

    更新记录: 完成第一次编辑:2022年4月23日20:29:33. 加入小黄人歌曲:2022年4月23日21:45:36. 1.1 设计模式(Design Pattern)是什么 设计模式是理论.是前 ...

  4. supervisor的安装与使用

    Ubuntu安装使用supervisor 进程管理工具 安装 apt-get install supervisor 查看是否安装成功 pgrep supervisord # 返回进程号则成功 改配置文 ...

  5. 2分钟实现一个Vue实时直播系统

    前言 我们在不敲代码的时候可能会去看游戏直播,那么是前台怎么实现的呢?下面我们来讲一下.第一步,购买云直播服务 首先,你必须去阿里云或者腾讯云注册一个直播服务.也花不了几个钱,练手的话,几十块钱就够了 ...

  6. SAP Tree editor(树形结构)

    SAP List Tree 效果 源代码 *&---------------------------------------------------------------------* *& ...

  7. UiPath鼠标操作图像的介绍和使用

    一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对图像的操作在UiPath中的使 ...

  8. 手把手教你实现在Monaco Editor中使用VSCode主题

    背景 笔者开源了一个小项目code-run,类似codepen的一个工具,其中代码编辑器使用的是微软的Monaco Editor,这个库是直接从VSCode的源码中生成的,只不过是做了一点修改让它支持 ...

  9. Intel的CPU系列说明

    至强可扩展系列是英特尔推出的新一代至强处理器系列,如今距离该系列推出几乎过去一年了.新的CPU并没有延续E系列的命名,英特尔将至强可扩展系列以金属命名,将该系列分为"铂金Platinum&q ...

  10. pytorch 基础内容

    一些基础的操作: import torch as th a=th.rand(3,4) #随机数,维度为3,4的tensor b=th.rand(4)print(a)print(b) a+b tenso ...