[hdu6326]Monster Hunter
考虑树是以1为中心的菊花图的情况,也即如何安排打怪兽的顺序
用二元组$(a,b)$来描述怪兽,则对于两个怪兽$(a_{1},b_{1})$和$(a_{2},b_{2})$,交换两者不会影响血量的变化量,而会改变初始血量的需求,具体即比较$\max(a_{1},a_{1}-b_{1}+a_{2})$和$\max(a_{2},a_{2}-b_{2}+a_{1})$
如果能证明传递性,那么以此进行排序即可
观察上述式子,可以得到以下信息:
1.$a\le b$的怪兽优于$a>b$的怪兽
2.对于$a\le b$的怪兽,$a$小的怪兽优于$a$大的怪兽
3.对于$a>b$的怪兽,$b$大的怪兽优于$b$小的怪兽
(代入均可证明)
进而上述信息足以比较,同时也具有传递性,即得证
回到原问题,有一个比较经典的套路:
考虑当前最优的位置,其父亲的怪兽被打死后一定会打其(注意怪兽只会被消除而不会增加),进而不妨将其与父亲合并(先打父亲再打其),合并方式参考之前
关于过程的维护,可以用一个并查集+set实现
时间复杂度为$o(n\log n)$,可以通过


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 struct Data{
6 ll a,b;
7 bool operator < (const Data &k)const{
8 if ((a<=b)!=(k.a<=k.b))return a<=b;
9 if (a<=b)return a<k.a;
10 return b>k.b;
11 }
12 }a[N];
13 vector<int>v[N];
14 set<pair<Data,int> >S;
15 int t,n,x,y,fa[N],f[N];
16 Data merge(Data x,Data y){
17 ll a=max(x.a,x.a-x.b+y.a);
18 return Data{a,x.b+y.b-x.a-y.a+a};
19 }
20 int find(int k){
21 if (k==f[k])return k;
22 return f[k]=find(f[k]);
23 }
24 void dfs(int k,int f){
25 fa[k]=f;
26 for(int i=0;i<v[k].size();i++)
27 if (v[k][i]!=f)dfs(v[k][i],k);
28 }
29 void merge(int x,int y){
30 x=find(x),y=find(y);
31 if (x!=1)S.erase(make_pair(a[x],x));
32 f[y]=x,a[x]=merge(a[x],a[y]);
33 if (x!=1)S.insert(make_pair(a[x],x));
34 }
35 int main(){
36 scanf("%d",&t);
37 while (t--){
38 scanf("%d",&n);
39 a[1]=Data{0,0},S.clear();
40 for(int i=1;i<=n;i++)v[i].clear();
41 for(int i=2;i<=n;i++){
42 scanf("%lld%lld",&a[i].a,&a[i].b);
43 S.insert(make_pair(a[i],i));
44 }
45 for(int i=1;i<n;i++){
46 scanf("%d%d",&x,&y);
47 v[x].push_back(y);
48 v[y].push_back(x);
49 }
50 dfs(1,0);
51 for(int i=1;i<=n;i++)f[i]=i;
52 for(int i=1;i<n;i++){
53 int x=(*S.begin()).second;
54 S.erase(S.begin());
55 merge(fa[x],x);
56 }
57 printf("%lld\n",a[1].a);
58 }
59 return 0;
60 }
[hdu6326]Monster Hunter的更多相关文章
- [HDU6326]Monster Hunter(贪心)
用(a,b)表示一个点先失去a点HP,然后增加b点HP 首先容易证明忽略父亲条件下,任意两个点,先吃b大的最优 对于一个节点v和它的父节点u,若此时选v最优,那么就是吃到u时可以立即吃掉v, 于是可以 ...
- Day3-A-Problem H. Monster Hunter HDU6326
Little Q is fighting against scary monsters in the game ``Monster Hunter''. The battlefield consists ...
- HDU暑假多校第三场H.Monster Hunter
一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...
- HDU 6326 Problem H Monster Hunter
\(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...
- 2020ICPC南京 M.Monster Hunter
题目大意 一颗根为 \(1\) 的有 \((2≤≤2000)\) 个节点的树,每个节点有一个权值 \(ℎ_{} (1≤ℎ_{}≤10^9)\) ,能删除某个点的前提是其父亲节点已经被删除,并且删除一个 ...
- 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 号点出 ...
- 2018 Multi-University Training Contest 3 - HDU Contest
题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2018 Multi-University Training Contest 3 Solution
A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...
随机推荐
- MySQL初步学习——2021.09.27每日总结,第四周周一
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了SQL语句的分类: SQL语句很多,分为 1.DQL:数据查询语言(凡是带有select关键字的都是查询语句) 2 ...
- CVPR2021提出的一些新数据集汇总
前言 在<论文创新的常见思路总结>(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文.因此纠结于选择课题方向的读者可以考虑以下几个新方向.文末附相关论文获取方式. ...
- 使用CSS选择器(第二部分)
伪类跟伪元素一样,并不是直接针对文档元素的,而是为你基于某些共同特征选择元素提供方便. 使用结构性伪类选择器 使用结构性伪类选择器能够根据元素在文档中的位置选择元素.这类选择器都有一个冒号字符前缀(: ...
- NX9.0和NX10.0做自定义操作可以用的函数
NX9.0:LIBUFUNX.DLL int UF_OPER_ask_check_geom(void *,int *,unsigned int * *) int UF_OPER_ask_first_o ...
- 初学Python-day10 函数2
函数 1.函数也是一种数据 函数也是一种数据,可以使用变量保存 回调函数(参数的值还是一个函数) 实例: def test(): print('hello world') def test1(a): ...
- javascript-jquery的基本方法
1.去除字符串中两端的空格$.trim(str) var str1=" 123 " $.trim(str1);//123 2.遍历对象的数据并进行操作$.each(obj,func ...
- 记一次 .NET 某资讯论坛 CPU爆高分析
大概有11天没发文了,真的不是因为懒,本想前几天抽空写,不知道为啥最近求助的朋友比较多,一天都能拿到2-3个求助dump,晚上回来就是一顿分析,有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓 ...
- [no code][scrum meeting] Beta 4
例会时间:5月16日11:30,主持者:伦泽标 下次例会时间:5月18日11:30,主持者:叶开辉 一.工作汇报 人员 昨日完成任务 明日要完成的任务 乔玺华 完成整体框架设计与登录逻辑 与后端对接 ...
- 『学了就忘』Linux基础 — 10、VMware虚拟机中克隆的使用
目录 1.什么是克隆 2.克隆的两种类型 (1)完整克隆 (2)链接克隆 3.克隆操作 步骤一:克隆虚拟机 步骤二:进行克隆导向 3.快照与克隆的区别 4.镜像的管理 快照和克隆是VMware中两个非 ...
- python中yield的理解
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...