Little Q is fighting against scary monsters in the game ``Monster Hunter''. The battlefield consists of nn intersections, labeled by 1,2,...,n1,2,...,n, connected by n−1n−1bidirectional roads. Little Q is now at the 11-th intersection, with XX units of health point(HP). 
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的更多相关文章

  1. HDU 6326 Problem H Monster Hunter

    \(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...

  2. 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 号点出 ...

  3. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  4. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  5. 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. ...

  6. Gym 100531H Problem H. Hiking in the Hills 二分

    Problem H. Hiking in the Hills 题目连接: http://codeforces.com/gym/100531/attachments Description Helen ...

  7. Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞

    Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...

  8. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  9. 清北学堂入学测试P4751 H’s problem(h)

    P4751 H’s problem(h)  时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...

随机推荐

  1. CSS样式的优先级(权重)

    当使用不同的选择器选中同一个元素并设置相同样式时,这时样式间产生了冲突 最终采用的是哪个选择器? 由选择器的优先级(权重)决定,权重高的优先显示 优先级规则(多个按位置分别进行计算,不进位): 内联样 ...

  2. MVC集合ModelBinder

    使用腳本提交集合类时,MVC binding public class FormExtensionValueProviderFactory : ValueProviderFactory { publi ...

  3. 「JSOI2014」打兔子

    「JSOI2014」打兔子 传送门 首先要特判 \(k \ge \lceil \frac{n}{2} \rceil\) 的情况,因为此时显然可以消灭所有的兔子,也就是再环上隔一个点打一枪. 但是我们又 ...

  4. 操作系统OS - 线程中的join()为什么叫join

    1. 问题:很好奇为什么叫Join? 参考: https://blog.csdn.net/frankarmstrong/article/details/55504161 https://stackov ...

  5. 算法-leetcode-65-Valid Number

    算法-leetcode-65-Valid Number 上代码: # coding:utf-8 __author__ = "sn" """Valida ...

  6. PAT A1131 Subway Map

    dfs,选择最优路径并输出~ 这道题难度非常炸裂,要求完完整整自己推一遍,DFS才算过关!思路:一遍dfs,过程中要维护两个变量,minCnt 中途停靠最少的站.minTransfer需要换成的最少次 ...

  7. WebService-CXF 学习笔记

    什么是CXF Apache CXF = Celtix + Xfire支持多种协议:SOAP1.1,1.2XML/HTTPCORBA(Common Object Request Broker Archi ...

  8. SQL SERVER 语法汇总

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  9. js 原生url编码

    参考:http://www.runoob.com/jsref/jsref-decodeuricomponent.html

  10. 第1节 Scala基础语法:9、10、数组

    1. 定义数组时,没有new和有new是有区别的: scala> val arr3 = Array[Int](2)    此时,arr3中仅包含1个元素2arr3: Array[Int] = A ...