CCPC 2017 哈尔滨 L. Color a Tree && HDU 6241(二分+树形DP)
题目链接: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
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <stack>
- #include <queue>
- #include <vector>
- #include <map>
- #include <set>
- #include <bitset>
- using namespace std;
- #define ll long long
- #define ull unsigned long long
- #define mst(a,b) memset((a),(b),sizeof(a))
- #define pii pair<int,int>
- #define pII pair<ll,ll>
- #define pi acos(-1)
- #define pb push_back
- const double eps = 1e-;
- const int inf = 0x3f3f3f3f;
- const ll INF = 0x3f3f3f3f3f3f3f3f;
- const int MAXN = 1e5 + ;
- const int MAXM = 1e6 + ;
- int n;
- vector<int>vec[MAXN];
- int siz[MAXN],b[MAXN],mn[MAXN],mx[MAXN];
- int up[MAXN],down[MAXN];
- void init() {
- for(int i = ; i <= n; i++) {
- vec[i].clear();
- b[i] = mn[i] = ;
- }
- }
- void getsize(int u,int fa) {
- siz[u] = ;
- for(int i = ; i < vec[u].size(); i++) {
- int v = vec[u][i];
- if(v == fa) continue;
- getsize(v,u);
- siz[u] += siz[v];
- }
- }
- bool dfs(int u,int fa) {
- int l = , r = ;
- for(int i = ; i < vec[u].size(); i++) {
- int v = vec[u][i];
- if(v == fa) continue;
- if(!dfs(v,u)) return false;
- l += down[v], r += up[v];
- }
- down[u] = max(l, mn[u]), up[u] = min(r, mx[u]);
- return down[u] <= up[u];
- }
- bool check(int x) {
- for(int i = ; i <= n; i++) {
- mx[i] = min(x - b[i],siz[i]);
- if(mx[i] < ) return false;
- }
- return dfs(,) && down[] <= x && x <= up[];
- }
- int main() {
- #ifdef local
- freopen("data.txt", "r", stdin);
- #endif
- int t;
- scanf("%d",&t);
- while(t--) {
- scanf("%d",&n);
- init();
- for(int i = ; i < n; i++) {
- int u,v;
- scanf("%d%d",&u,&v);
- vec[u].pb(v);
- vec[v].pb(u);
- }
- getsize(,);
- int m;
- bool flag = true;
- scanf("%d",&m);
- while(m--) {
- int x,y;
- scanf("%d%d",&x,&y);
- mn[x] = max(mn[x],y);
- if(y > siz[x]) flag = false;
- }
- scanf("%d",&m);
- while(m--) {
- int x,y;
- scanf("%d%d",&x,&y);
- b[x] = max(b[x],y);
- if(y > n - siz[x]) flag = false;
- }
- if(!flag) {
- puts("-1");
- continue;
- }
- int l = , r = n, ans = -;
- while(l <= r) {
- int mid = (l + r) >> ;
- if(check(mid)) ans = mid, r = mid - ;
- else l = mid + ;
- }
- printf("%d\n",ans);
- }
- return ;
- }
CCPC 2017 哈尔滨 L. Color a Tree && HDU 6241(二分+树形DP)的更多相关文章
- Color a Tree HDU - 6241
/* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...
- HDU 5682 zxa and leaf 二分 树形dp
zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...
- HDU 3586 Information Disturbing(二分+树形dp)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...
- hdu Anniversary party 树形DP,点带有值。求MAX
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- poj 2342 hdu 1520【树形dp】
poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
随机推荐
- cent7配置阿里yum源
阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/CentOS系统更换软件安装源第一步:备份你的原镜像文件,以免出错后可以恢复.mv /etc/yum.repos.d ...
- DataNode 详解及HDFS 2.X新特性
1. 工作机制 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode 启动后向 Name ...
- [CF1065F]Up and Down the Tree_tarjan_树形dp
Up and Down the Tree 题目链接:https://www.luogu.org/problem/CF1065F 数据范围:略. 题解: 我们把每个叶子向它上面$k$个点连边,然后tra ...
- vue2.0 + npm + webpack 开发===环境配置
cnpm安装:npm install -g cnpm --registry=http://registry.npm.taobao.org 1.安装vue-cli脚手架构建工具cnpm install ...
- 【k8s第二步】Kubernetes-Kubeadm部署安装【已修正错误】
⒈开启kube-proxy的ipvs的前置条件 模式改为lvs调度的方式,kube-proxy主要解决的是svc(service)与pod之间的调度关系,ipvs的调度方式可以极大的增加它的访问效率, ...
- C/C++快读(快速读入)有多——安全AC
在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. ...
- Numbers(CodeForces-128D)【思维/list】
题目链接:https://vjudge.net/problem/CodeForces-128D 题意:给出一组数,要求将这些数排列成一个环,满足每相邻两个数的差值为1,问能否完成. 思路:先取出最小的 ...
- 网站页面顶部出现空白行字符的原因以及完美解决办法
转自个人博客:https://www.hurbai.com 有时候网页头部会出现一个空白行,查看源码发现body开头初有一个非法字符 // 如果是Windows系统,修改为:$WIN = 1; $W ...
- MyBatis 示例-动态 SQL
MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...
- react开发vscode插件推荐
原文地址:https://github.com/xieqingtian/blog/issues/2 由于本人主要是做react开发,用的代码编辑器是传说中的宇宙第一前端神器vscode, 所以在这里记 ...