Day3-A-Problem H. Monster Hunter HDU6326
There is a monster at each intersection except 11. When Little Q moves to the kk-th intersection, he must battle with the monster at the kk-th intersection. During the battle, he will lose aiai units of HP. And when he finally beats the monster, he will be awarded bibi units of HP. Note that when HP becomes negative(<0<0), the game will over, so never let this happen. There is no need to have a battle at the same intersection twice because monsters do not have extra life.
When all monsters are cleared, Little Q will win the game. Please write a program to compute the minimum initial HP that can lead to victory.
InputThe first line of the input contains an integer T(1≤T≤2000)T(1≤T≤2000), denoting the number of test cases.
In each test case, there is one integer n(2≤n≤100000)n(2≤n≤100000) in the first line, denoting the number of intersections.
For the next n−1n−1 lines, each line contains two integers ai,bi(0≤ai,bi≤109)ai,bi(0≤ai,bi≤109), describing monsters at the 2,3,...,n2,3,...,n-th intersection.
For the next n−1n−1 lines, each line contains two integers uu and vv, denoting a bidirectional road between the uu-th intersection and the vv-th intersection.
It is guaranteed that ∑n≤106∑n≤106.
OutputFor each test case, print a single line containing an integer, denoting the minimum initial HP.
Sample Input
1
4
2 6
5 4
6 2
1 2
2 3
3 4
Sample Output
3 思路:直接贴一个官方题解
代码如下:(不懂的可以再问我):
typedef long long LL;
const int maxm = ;
struct Node {
int id, change;
LL a, b;
bool operator < (const Node &x) const {
if(a >= b && x.a < x.b ) return true; // b > a 的优先
if(a < b && x.a >= x.b ) return false;
if(a < b && x.a < x.b ) return a>x.a;//a < b,按照a从小到大
if(a >= b && x.a >= x.b) return b<x.b;//a >= b,按照b从大到小
}
void operator += (const Node &n) { // A means the minimum HP to kill monster
LL A = a, B = b;
if(b < n.a) {
A = a + n.a - b;
B = n.b;
} else {
B = b - n.a + n.b;
}
a = A, b = B;
}
} buf[maxm];
int fa[maxm], vis[maxm], cnt, n;
vector<int> G[maxm];
void build(int u, int father) {
fa[u] = father;
for (int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(v != father)
build(v, u);
}
}
int Find(int u) {
if(vis[fa[u]])
return fa[u] = Find(fa[u]);
else
return fa[u];
}
void init() {
cnt = ;
buf[].a = buf[].b = buf[].change = ;
buf[].id = ;
memset(vis, , sizeof(vis)), memset(fa, , sizeof(fa));
for (int i = ; i <= n; ++i)
G[i].clear();
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
init();
priority_queue<Node> q;
for (int i = ; i <= n; ++i) {
scanf("%lld%lld", &buf[i].a, &buf[i].b);
buf[i].id = i, buf[i].change = ;
q.push(buf[i]);
}
for (int i = ; i < n - ; ++i) {
int t1, t2;
scanf("%d%d", &t1, &t2);
G[t1].push_back(t2), G[t2].push_back(t1);
}
build(, );
while(!q.empty()) {
Node tmp = q.top();
q.pop();
int u = tmp.id;
if(vis[u] || tmp.change != buf[u].change)
continue;
vis[u] = ;
int f = Find(u);
buf[f] += buf[u];
if(f > ) {
buf[f].change = ++cnt;
q.push(buf[f]);
}
}
printf("%lld\n", buf[].a);
}
return ;
}
tmp.change != buf[u].change: 堆中有修改前的u和修改后的u
Day3-A-Problem H. Monster Hunter HDU6326的更多相关文章
- HDU 6326 Problem H Monster Hunter
\(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...
- HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)
6326.Problem H. Monster Hunter 题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP.求从 1 号点出 ...
- HDU暑假多校第三场H.Monster Hunter
一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem H
Problem H High bridge, low bridge Q: There are one high bridge and one low bridge across the river. ...
- Gym 100531H Problem H. Hiking in the Hills 二分
Problem H. Hiking in the Hills 题目连接: http://codeforces.com/gym/100531/attachments Description Helen ...
- Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞
Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- 清北学堂入学测试P4751 H’s problem(h)
P4751 H’s problem(h) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...
随机推荐
- Python:json 模块
字符串转dict.list data = "[{....},{...},...]" list_data = json.loads(data) dict.list转字符串 list ...
- 吴裕雄--天生自然TensorFlow2教程:单输出感知机及其梯度
import tensorflow as tf x = tf.random.normal([1, 3]) w = tf.ones([3, 1]) b = tf.ones([1]) y = tf.con ...
- Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data
在常见业务开发中,POST请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用Postman测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-form- ...
- [03] Recursive Function递归应用
递归应用 1.理解 百科:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的: 理解:函数调用自己的过程,这类函数处理的事情具有重复性,处理此类实行可用while或者for,但结构上 ...
- 迭代器对象numpy.nditer在数组上进行迭代——修改数组的值
nditer对象有另一个可选参数op_flags,默认情况下,nditer将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定op_flags= ...
- codeforces round#613
A题:输出n+1: B题: 题意:就是给n个数,a人全拿,b人拿连续的子段和,如果b人比a人大于等于的话输出NO,反之输出YES 思路:最大子段和,比赛的时候忘记 ll 和 字段和不是遇到负数就重置. ...
- 关于找不到指定的模块,异常来自HRESULT:0x8007007E的解决方法
上午从公司前辈那里拷贝到的ASP.NET代码,在自己机器上部署的时候发现问题,直接报错,找不到指定的模块,异常来自HRESULT:0x8007007E.并且一大堆警告. 在网上百度很多解决方法,归纳如 ...
- #P2010 回文日期 的题解
题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...
- 无法访问Eureka主页
spring: application: name: 90foodmall-eureka server: port: 8000 eureka: client: #是否将自己注册到Eureka Serv ...
- 一、log4j日志框架的理论和不同场景使用
1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...
