题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6241

题意:给你一棵有 n 个结点的树,每个结点初始颜色都为白色,有 A 个条件:结点 x_i 的黑色结点数目不少于 y_i 个,同时有 B 个条件,除了结点 x_j 及其子树外至少有 y_j 个结点,求把最少要染成黑色结点的数目使得满足 A + B 个条件。

题解:参考自:https://blog.csdn.net/u013534123/article/details/78523559

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <string>
  7. #include <cmath>
  8. #include <stack>
  9. #include <queue>
  10. #include <vector>
  11. #include <map>
  12. #include <set>
  13. #include <bitset>
  14. using namespace std;
  15. #define ll long long
  16. #define ull unsigned long long
  17. #define mst(a,b) memset((a),(b),sizeof(a))
  18. #define pii pair<int,int>
  19. #define pII pair<ll,ll>
  20. #define pi acos(-1)
  21. #define pb push_back
  22. const double eps = 1e-;
  23. const int inf = 0x3f3f3f3f;
  24. const ll INF = 0x3f3f3f3f3f3f3f3f;
  25. const int MAXN = 1e5 + ;
  26. const int MAXM = 1e6 + ;
  27.  
  28. int n;
  29. vector<int>vec[MAXN];
  30. int siz[MAXN],b[MAXN],mn[MAXN],mx[MAXN];
  31. int up[MAXN],down[MAXN];
  32.  
  33. void init() {
  34. for(int i = ; i <= n; i++) {
  35. vec[i].clear();
  36. b[i] = mn[i] = ;
  37. }
  38. }
  39.  
  40. void getsize(int u,int fa) {
  41. siz[u] = ;
  42. for(int i = ; i < vec[u].size(); i++) {
  43. int v = vec[u][i];
  44. if(v == fa) continue;
  45. getsize(v,u);
  46. siz[u] += siz[v];
  47. }
  48. }
  49.  
  50. bool dfs(int u,int fa) {
  51. int l = , r = ;
  52. for(int i = ; i < vec[u].size(); i++) {
  53. int v = vec[u][i];
  54. if(v == fa) continue;
  55. if(!dfs(v,u)) return false;
  56. l += down[v], r += up[v];
  57. }
  58. down[u] = max(l, mn[u]), up[u] = min(r, mx[u]);
  59. return down[u] <= up[u];
  60. }
  61.  
  62. bool check(int x) {
  63. for(int i = ; i <= n; i++) {
  64. mx[i] = min(x - b[i],siz[i]);
  65. if(mx[i] < ) return false;
  66. }
  67. return dfs(,) && down[] <= x && x <= up[];
  68. }
  69.  
  70. int main() {
  71. #ifdef local
  72. freopen("data.txt", "r", stdin);
  73. #endif
  74. int t;
  75. scanf("%d",&t);
  76. while(t--) {
  77. scanf("%d",&n);
  78. init();
  79. for(int i = ; i < n; i++) {
  80. int u,v;
  81. scanf("%d%d",&u,&v);
  82. vec[u].pb(v);
  83. vec[v].pb(u);
  84. }
  85. getsize(,);
  86. int m;
  87. bool flag = true;
  88. scanf("%d",&m);
  89. while(m--) {
  90. int x,y;
  91. scanf("%d%d",&x,&y);
  92. mn[x] = max(mn[x],y);
  93. if(y > siz[x]) flag = false;
  94. }
  95. scanf("%d",&m);
  96. while(m--) {
  97. int x,y;
  98. scanf("%d%d",&x,&y);
  99. b[x] = max(b[x],y);
  100. if(y > n - siz[x]) flag = false;
  101. }
  102. if(!flag) {
  103. puts("-1");
  104. continue;
  105. }
  106. int l = , r = n, ans = -;
  107. while(l <= r) {
  108. int mid = (l + r) >> ;
  109. if(check(mid)) ans = mid, r = mid - ;
  110. else l = mid + ;
  111. }
  112. printf("%d\n",ans);
  113. }
  114. return ;
  115. }

CCPC 2017 哈尔滨 L. Color a Tree && HDU 6241(二分+树形DP)的更多相关文章

  1. Color a Tree HDU - 6241

    /* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...

  2. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...

  3. HDU 5682 zxa and leaf 二分 树形dp

    zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...

  4. HDU 3586 Information Disturbing(二分+树形dp)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...

  5. hdu Anniversary party 树形DP,点带有值。求MAX

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. poj 2342 hdu 1520【树形dp】

    poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...

  7. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  8. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

随机推荐

  1. cent7配置阿里yum源

    阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/CentOS系统更换软件安装源第一步:备份你的原镜像文件,以免出错后可以恢复.mv /etc/yum.repos.d ...

  2. DataNode 详解及HDFS 2.X新特性

    1. 工作机制 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode 启动后向 Name ...

  3. [CF1065F]Up and Down the Tree_tarjan_树形dp

    Up and Down the Tree 题目链接:https://www.luogu.org/problem/CF1065F 数据范围:略. 题解: 我们把每个叶子向它上面$k$个点连边,然后tra ...

  4. vue2.0 + npm + webpack 开发===环境配置

     cnpm安装:npm install -g cnpm --registry=http://registry.npm.taobao.org 1.安装vue-cli脚手架构建工具cnpm install ...

  5. 【k8s第二步】Kubernetes-Kubeadm部署安装【已修正错误】

    ⒈开启kube-proxy的ipvs的前置条件 模式改为lvs调度的方式,kube-proxy主要解决的是svc(service)与pod之间的调度关系,ipvs的调度方式可以极大的增加它的访问效率, ...

  6. C/C++快读(快速读入)有多——安全AC

    在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. ...

  7. Numbers(CodeForces-128D)【思维/list】

    题目链接:https://vjudge.net/problem/CodeForces-128D 题意:给出一组数,要求将这些数排列成一个环,满足每相邻两个数的差值为1,问能否完成. 思路:先取出最小的 ...

  8. 网站页面顶部出现空白行&#65279字符的原因以及完美解决办法

    转自个人博客:https://www.hurbai.com 有时候网页头部会出现一个空白行,查看源码发现body开头初有一个非法字符 // 如果是Windows系统,修改为:$WIN = 1; $W ...

  9. MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...

  10. react开发vscode插件推荐

    原文地址:https://github.com/xieqingtian/blog/issues/2 由于本人主要是做react开发,用的代码编辑器是传说中的宇宙第一前端神器vscode, 所以在这里记 ...