HDU 5682/BestCoder Round #83 1003 zxa and leaf 二分+树
zxa and leaf
zxa wanna set each node's beautiful level, which must be a positive integer. His unrooted tree has m(1≤m≤n) leaf nodes, k(1≤k≤m) leaf nodes of which have already been setted their beautiful levels, so that zxa only needs to set the other nodes' beautiful levels.
zxa is interested to know, assuming that the ugly level of each edge is defined as the absolute difference of the beautiful levels between two nodes connected by this edge, and the ugly level of the tree is the maximum of the ugly levels of **all the edges on this tree**, then what is the minimum possible ugly level of the tree, can you help him?
For each test case:
The first line contains two positive integers n and k, represent the tree has n nodes, k leaf nodes of which have already been setted their beautiful levels.
The next (n−1) lines, each line contains two distinct positive integers u and v, repersent there is an undirected edge between node u and node v.
The next k lines, each lines contains two positive integers u and w, repersent node u is a leaf node, whose beautiful level is w.
There is a blank between each integer with no other extra space in one line.
It's guaranteed that the input edges constitute a tree.
1≤T≤10,2≤n≤5⋅104,1≤k≤n,1≤u,v≤n,1≤w≤109
3 2
1 2
1 3
2 4
3 9
6 2
1 2
1 3
1 4
2 5
2 6
3 6
5 9
1
If you need a larger stack size, please use #pragma comment(linker, "/STACK:102400000,102400000") and submit your solution using C++.
题意:
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=696&pid=1003
题解:
二分答案LL,检查是否存在答案不超过LL的解,也即对于任意一条边上的两个点uu和vv,有|level_u-level_v|\leq L∣levelu−levelv∣≤L,如果能维护出每个点可能的取值区间就可以判断是否有解了。
对于n>1n>1的情况,随便找点做根,做树形dp即可,总的时间复杂度为O(n\log\max(w))O(nlogmax(w))。
需要注意的就是当n==2的时候,这个根要找好
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include<vector>
#include<map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N = +, M = 1e6+, mod = 1e9+,inf = 1e9;
typedef long long ll; int n,m,root,f,H[N],mi[N],mx[N],d[N];
vector<int >G[N];
void dfs(int u,int fa,int k) {
mi[u] = -inf;
mx[u] = inf;
if(H[u]) {
mi[u] = H[u];
mx[u] = H[u];
}
for(int i=;i<G[u].size();i++) {
int to = G[u][i];
if(to==fa) continue;
dfs(to,u,k);
if(mi[to]==-inf) continue;
mi[to] -= k;
mx[to] += k;
mi[u] = max(mi[u],mi[to]);
mx[u] = min(mx[u],mx[to]);
}
if(mi[u]==-inf) {
return ;
}
if(mi[u]>mx[u]) {
f = ;
return ;
}
}
bool check(int k) {
f = ;
dfs(root,-,k);
if(f) return true;
else return false;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) G[i].clear(),H[i] = ,d[i] = ;
for(int i=;i<n;i++) {
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);d[u]++,d[v]++;
}
if(n==) root = ;
else
for(int i=;i<=n;i++) {
if(d[i]!=) {
root = i;
break;
}
}
for(int i=;i<=m;i++) {
int x,y;
scanf("%d%d",&x,&y);
H[x] = y;
}
int l = ,r = 1e9,ans=1e9;
while(l<=r) {
int mid = (l+r)>>;
if(check(mid)) r=mid-,ans = mid;
else l = mid+;
}
printf("%d\n",ans);
}
return ;
}
HDU 5682/BestCoder Round #83 1003 zxa and leaf 二分+树的更多相关文章
- 从lca到树链剖分 bestcoder round#45 1003
bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...
- hdu 5667 BestCoder Round #80 矩阵快速幂
Sequence Accepts: 59 Submissions: 650 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- hdu 5643 BestCoder Round #75
King's Game Accepts: 249 Submissions: 671 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- hdu 5641 BestCoder Round #75
King's Phone Accepts: 310 Submissions: 2980 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 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 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]
传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- HDU 5506 - BestCoder Round #60 - GT and set
题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1003 题意 : 给N集 ...
- HDU 5505 - BestCoder Round #60 - GT and numbers
题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1002 思路 : N有若 ...
随机推荐
- Linux SSH安全策略限制IP登录方法(转)
本文介绍了Linux SSH安全策略限制IP登录的两种方法.具体如下: 方法一: 首先需要限制登录的ip(或者如果需要自己本地登录,查看最后登录ip即可) Vim /etc/hosts.allow 输 ...
- 初步揭秘node.js中的事件
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
- Stream探究
http://segmentfault.com/a/1190000003479884 1. 认识Stream Stream的概念最早来源于Unix系统,其可以将一个大型系统拆分成一些小的组件,然后将这 ...
- javascript 快速排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- matlab 之字体调整
FontWeight {normal} | bold | light | demi
- tyvj1213 嵌套矩形
描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...
- poj1013.Counterfeit Dollar(枚举)
Counterfeit Dollar Time Limit: 1 Sec Memory Limit: 64 MB Submit: 415 Solved: 237 Description Sally ...
- Python文件基础
===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...
- C语言内存对齐详解(2)
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...
- [Effective JavaScript 笔记]第21条:使用apply方法通过不同数量的参数调用函数
apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同.apply()方法接收两个参数,一个是对象,一个是参数数组. apply()作用 1.用于延长函数 ...