6326.Problem H. Monster Hunter

题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP。求从 1 号点出发按照最优策略打败所有怪兽一开始所需的最少 HP。

直接贴官方题解吧,这个题写的脑壳疼。

官方题解:

其实就是一直合并节点,最后合并到只有一个节点就是结果,具体的不想说什么了,这个题看了好久了,不想再看到他了。。。

代码是个人理解+个人习惯+综合多个题解写的。mdzz,我要撞墙。。。

代码:

 //1008-6326-贪心模拟+并查集+堆(优先队列)优化父亲节点
//因为对于同一层而言,只是比较谁的a小,谁的b大,不同层,需要先ko掉父亲再找儿子才可以,这种情况就需要判断一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=2e5+;
struct node{
int u,num;
ll a,b; bool operator< (const node &x) const {//流水线排序 因为是优先队列,和正常的排序是反的
if(a>=b&&x.a< x.b) return true;
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 &x){//节点合并,节点a表示至少需要a的血量杀死这个怪物
ll A=max(a,a-b+x.a);
ll B=b-a+x.b-x.a+A;
a=A,b=B;
} }a[maxn]; priority_queue<node> q;
vector<int> g[maxn];
int fa[maxn],del[maxn],vis[maxn]; void init(int n)//初始化
{
while(!q.empty()) q.pop();
for(int i=;i<=n;i++){
vis[i]=;del[i]=;
g[i].clear();
a[i].a=a[i].b=;
a[i].u=a[i].num=;
a[i].u=i;
}
} void dfs(int u,int father)
{
fa[u]=father;
for(int i=;i<g[u].size();i++){
int v=g[u][i];
if(v!=father)
dfs(v,u);
}
} int Find(int u)//并查集路径压缩
{
if(del[fa[u]])//父亲被删除,就找爷爷
return fa[u]=Find(fa[u]);
else
return fa[u];
} int main()
{
int t;scanf("%d",&t);
while(t--){
int n; scanf("%d",&n);
init(n);
for(int i=;i<=n;i++){
scanf("%lld%lld",&a[i].a,&a[i].b);
a[i].u=i;a[i].num=;
q.push(a[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);
}
dfs(,);
int pos=;
while(!q.empty()){
node t=q.top();q.pop();
if(del[t.u]||t.num!=vis[t.u])continue;//如果节点删除或者节点已经被更新
del[t.u]=;//删除该点
int f=Find(t.u);//找父节点
a[f]+=a[t.u];
if(f>){
a[f].num=vis[f]=++pos;//更新f节点(找到的父亲节点)
q.push(a[f]);
}
}
printf("%lld\n",a[].a);
}
return ;
}

关于结构体里面的排序,我以前写过一篇垃圾博客,可以看一下,有错的,可以锤我。。。

结构体内嵌比较函数bool operator < (const node &x) const {}

滚了滚了000OOOooo。。。...

HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)的更多相关文章

  1. HDU 6326 Problem H Monster Hunter

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

  2. hdu 2818 Building Block(加权并查集)2009 Multi-University Training Contest 1

    题意: 一共有30000个箱子,刚开始时都是分开放置的.接下来会有两种操作: 1. M x y,表示把x箱子所在的一摞放到y箱子那一摞上. 2. C y,表示询问y下方有多少个箱子. 输入: 首行输入 ...

  3. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

  4. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

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

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

  6. Day3-A-Problem H. Monster Hunter HDU6326

    Little Q is fighting against scary monsters in the game ``Monster Hunter''. The battlefield consists ...

  7. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

    以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...

  9. HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)

    6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...

随机推荐

  1. Aspose.words 替换字符 操作

    var path = Server.MapPath("~/doc/demo.doc"); Document doc = new Document(path); DocumentBu ...

  2. 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan

    题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...

  3. AGC016C +/- Rectangle(构造)

    题目大意:给定H,W,h,w四个数,求是否满足矩阵的全部数之和和正数,h行w列之和为负数 如果h和w恰好是H,W的约数,则肯定不存在 否则肯定存在 只需要把h,w内每个元素填的足够大,然后小矩形的最后 ...

  4. Visio中设置自定义属性的值

    ShapeSheet中User-Define Cells中Prompt格. 帮助解释为:为用户定义的单元格指定说明性提示或注释.应用程序自动将提示文本用引号 (" ") 引起来,以 ...

  5. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

  6. ServletContext 接口读取配置文件要注意的路径问题

    在建立一个maven项目时,我们通常把一些文件直接放在resource下面,在ServletContext中有getResource(String path)和getResourceAsStream( ...

  7. AngularJs开发——控制器间的通信

    AngularJs开发——控制器间的通信 指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制 ...

  8. hbase集群写不进去数据的问题追踪过程

    hbase从集群中有8台regionserver服务器,已稳定运行了5个多月,8月15号,发现集群中4个datanode进程死了,经查原因是内存 outofMemory了(因为这几台机器上部署了spa ...

  9. tomcat内存配置(二)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进 ...

  10. 【SPOJ - QTREE2】树链剖分

    http://acm.hust.edu.cn/vjudge/problem/19960 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...