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. 使用 TListView 控件(2)

    本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  2. log4j的常用使用方法

    第一步,引入jar包,不做介绍. 第二步,创建以下类(固定写法) package smn.util; import org.apache.log4j.Logger; public class MyLo ...

  3. 配合JAVA的AJAX使用

    概要 Ajax是“Asynchronous JavaScript and XML”的简称,即异步的JavaScript和XML. readyState属性用来返回当前的请求状态,有五个可选值.分别是0 ...

  4. vector 基础

    http://classfoo.com/ccby/article/jnevK Vector的存储空间是连续的,list不是连续存储的 vector初始化 vector<int>v; //不 ...

  5. 几个JavaScript的浏览器差异处理问题

    JQuery确实是个很好用的库,你可以不用考虑很多细节方面的事情.但很作为一个web前端,处理和了解浏览器差异一个重要问题.下面将介绍一些总结,先介绍没有使用js库的情况. 1. setAttribu ...

  6. Clevo P950笔记本加装4G模块

    要补全的电路部分如下(原理图见附件) 这里经过尝试,发现左上角R217,R218不用接,3G_POWER部分不接(包括MTS3572G6.UK3018及电阻电容,3G_PWR_EN实测是3.3V,驱动 ...

  7. Input操作文件

    在HTML表单中,可以上传文件的唯一控件就是<input type="file">. 注意:当一个表单包含<input type="file" ...

  8. python爬取七星彩的开奖历史记录

    1.因为人不可能一直无休止的学习,偶尔也想做点儿别的,昨天无聊就想写写Python,当然我承认我上班后基本都是在学工作方面的事情,在这个岗位我也呆了三年多了,还是那句话问我什么会不会我会给你说我啥都会 ...

  9. 单个回调函数中返回多个Request以及Item

    import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'example.com' ...

  10. Sync Data to AWS S3 on Windows Box

    1. Install AWS CLI first, windows download link https://s3.amazonaws.com/aws-cli/AWSCLI64.msi 2. The ...