题目描述

牛半仙的妹子被大魔王抓走了,牛半仙为了就他的妹子,前往攻打魔塔。

魔塔为一棵树,牛半仙初始在一号点。

牛半仙有攻击,防御,血量三个属性。

除一号点外每个点都有魔物防守,魔物也有攻击,防御,血量三个属性。

每个怪物后面都守着一些蓝宝石,获得1蓝宝石可增加1防。

牛半仙具有突袭属性,所以遇到魔物后会率先发动攻击,然后牛半仙和魔物轮换地攻击对方。

一个角色被攻击一次减少的血量是对方的攻击减去自己的防御。

当一个角色的血量小于等于 0 时,他就会死亡。

当牛半仙第一次到达某个节点时会与这个节点的魔物发生战斗。

当一个魔物死亡后,这个魔物所在的节点就不会再产生新的魔物。

现在牛半仙想知道他打死魔塔的所有魔物后的最大血量。

输入描述:

第一行一个 n 代表节点数。 随后 n-1 行,每行两个数 i,j,表示 i 与 j 节点有边相连。
随后一行,三个数,依次为勇士的血量、攻击、防御。 随后 n-1 行,每行四个数,依次为怪物的血量、攻击、防御,和其守着的蓝宝石数量。

输出描述:

一个数,代表最大血量。如果牛半仙在打死魔塔的所有魔物之前就已经死亡了,则输出 -1。

备注:

对于100%的数据: n ≤ 1 0 5 n \le 10^5 n≤105,树
对于100%的数据:有牛半仙血量 < 5 ∗ 1 0 18 <5*10^{18} <5∗1018,攻击 = 2000 =2000 =2000,盔甲防御 = 0 =0 =0。怪物血量为 3000 3000 3000 ~
1 0 6 10^6 106,攻击 5 × 1 0 5 5×10^5 5×105− 7 × 1 0 5 7\times 10^5 7×105,防御 ≤ 1000 \leq 1000 ≤1000,打完一只怪后获得的蓝宝石数量为 1 1 1至 5 5 5

官方题解看懂 自己琢磨了一下想通了
所以写个通俗 ju ruo 点儿的

考虑第 i i i个攻击的怪

记第 i i i个怪有 b i b_i bi​个蓝宝石

因为怪的血量和攻击和防御是不变的 勇士的攻击也是不变的

所以它会被勇士攻击 ⌈ 血 量 勇 士 攻 击 − 防 御 ⌉ \lceil\dfrac{血量}{勇士攻击-防御}\rceil ⌈勇士攻击−防御血量​⌉ 轮

并攻击勇士 ⌈ 血 量 勇 士 攻 击 − 防 御 ⌉ − 1 \lceil\dfrac{血量}{勇士攻击-防御}\rceil -1 ⌈勇士攻击−防御血量​⌉−1 轮 可直接求出 记为 h i h_i hi​

造成的伤害为 h i × ( 攻 击 − 初 始 防 御 − ∑ j = 1 i − 1 b i ) h_i\times (攻击-初始防御-\sum_{j=1}^{i-1}b_i) hi​×(攻击−初始防御−∑j=1i−1​bi​)

总伤害为 ∑ i = 1 n h i × ( 攻 击 − 初 始 防 御 − ∑ j = 1 i − 1 b i ) \sum_{i=1}^n h_i\times (攻击-初始防御-\sum_{j=1}^{i-1}b_i) ∑i=1n​hi​×(攻击−初始防御−∑j=1i−1​bi​)

求这个的最小值 即求 ∑ i = 1 n h i × ∑ j = 1 i − 1 b i \sum_{i=1}^n h_i\times \sum_{j=1}^{i-1}b_i ∑i=1n​hi​×∑j=1i−1​bi​ 的最大值

可以推出按照权值 t i = h i b i t_i=\dfrac{h_i}{b_i} ti​=bi​hi​​ 升序排出来的答案最优

证明:若最优的情况为: h 1 , h 2 . . . h n h_1,h_2...h_n h1​,h2​...hn​ 。 交换 i i i, i + 1 i+1 i+1答案的改变量是 h i × b i + 1 − h i + 1 × b i < 0 h_i\times b_{i+1}-h_{i+1}\times b_i<0 hi​×bi+1​−hi+1​×bi​<0

即 h i b i < h i + 1 b i + 1 \dfrac{h_i}{b_i}<\dfrac{h_{i+1}}{b_{i+1}} bi​hi​​<bi+1​hi+1​​ 得证 (感性理解也可)

考虑贪心 我们先攻击 t i t_i ti​ 小的 再攻击大的

显然不行 比如一个 t i t_i ti​大的点有很多 t i t_i ti​ 小的子节点

这里给出一个结论
若儿子节点 y y y 的 t t t 小于父亲节点 x x x 的 t t t
那么攻击了的父亲节点 x x x 过后 会立即攻击儿子 y y y (这里好好想想为什么)

根据这个结论 我们可以从权值最小的节点开始 若节点 y y y 的权值小于父亲 x x x
这就意味着会连续攻击 x , y x,y x,y
我们就把 y y y 合并到 x x x 上 合并成一个大点

这个大点的权值 t t t 变成 ∑ h i ∑ b i \dfrac{\sum h_i}{\sum b_i} ∑bi​∑hi​​

证明:若 1 1 1号节点和 2 2 2节点要连续攻击 比较下面两种情况对答案的贡献

① 按 1 , 2 , 3 1,2,3 1,2,3 排 h 2 × b 1 + h 3 × ( b 1 + b 2 ) h_2\times b_1+h_3\times (b_1+b_2) h2​×b1​+h3​×(b1​+b2​)

② 按 3 , 1 , 2 3,1,2 3,1,2 排 h 1 × b 3 + h 2 × ( b 3 + b 1 ) h_1\times b_3+h_2\times (b_3+b_1) h1​×b3​+h2​×(b3​+b1​)

①-②得 h 3 ( b 1 + b 2 ) − ( h 1 + h 2 ) b 3 h_3(b_1+b_2)-(h_1+h_2)b_3 h3​(b1​+b2​)−(h1​+h2​)b3​

比较答案大小即比较的是 h 1 + h 2 b 1 + b 2 \dfrac{h_1+h_2}{b_1+b_2} b1​+b2​h1​+h2​​和 h 3 b 3 \dfrac{h_3}{b_3} b3​h3​​ 的大小 所以大点的权值为 ∑ h i ∑ b i \dfrac{\sum h_i}{\sum b_i} ∑bi​∑hi​​ 得证

从权值最小的节点开始 若点 y y y 的权值小于父亲所在的大点 x x x 就把 y y y 合并到 x x x 上 合并成一个大点

处理完后就从根节点开始 贪心地选择可以到达点中 权值最小的点

所形成的顺序就是攻击怪物的顺序了

#include <bits/stdc++.h>
#define N 210000
using namespace std;
typedef long long ll;
int n;
int f[N],nxt[N],data[N],num,fa[N],ff[N];
ll ans;
bool tag[N];
struct node{ll val,siz,pos;
}h[N];
inline bool operator <(node x,node y){ return 1ll*x.val*y.siz>1ll*y.val*x.siz; }
inline void add(int x,int y){ nxt[++num]=f[x]; f[x]=num; data[num]=y; }
priority_queue<node> q;
inline int findf(int x){ return fa[x]==x?x:fa[x]=findf(fa[x]); }
inline void dfs(int x){int y;for(int i=f[x];i;i=nxt[i]){y=data[i]; if(y==ff[x])continue;ff[y]=x; dfs(y); }
}
int main(){cin>>n;ll x,y,z,a,b;for(int i=1;i<n;i++){ scanf("%lld %lld",&x,&y); add(x,y); add(y,x); }scanf("%lld %lld %lld",&ans,&a,&b); fa[1]=1;h[1].siz=b;for(int i=2;i<=n;i++){fa[i]=i;scanf("%lld %lld %lld %lld",&z,&x,&y,&h[i].siz);h[i].val=z/(a-y); if(z%(a-y)!=0)h[i].val++;h[i].val--;ans-=(x-b)*h[i].val;h[i].pos=i;q.push(h[i]);}dfs(1);node u;while(!q.empty()){u=q.top(); q.pop(); x=u.pos;if(tag[x])continue; tag[x]=1;y=findf(ff[x]);ans+=h[y].siz*h[x].val;h[y].val+=h[x].val; h[y].siz+=h[x].siz;if(y!=1&&tag[y]==0)q.push(h[y]);fa[x]=y;}cout<<ans;
}

讲得不清楚就问哦 毕竟蒟蒻描述能力真的…不太好

T4牛半仙的魔塔(增强版)相关推荐

  1. 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】

    题意:一个魔塔游戏的地图是一棵以 111 为根的树,起点为根,除根外每个结点有一个怪物,给定每个怪物血量.攻击.防御.奖励蓝宝石个数(加防御),勇士的血量.攻击.防御,遇到怪物必须战斗,勇士永远先手, ...

  2. 教你DIY中文增强版Geexbox,且安装为硬盘版

    [url]http://hi.baidu.com/dekiny/blog/item/10421bced025433ab700c8c7.html[/url] [url]http://geexbox.or ...

  3. miui12.5增强版刷机教程

    8.10号雷总发布了mix4手机,顺便讲了一下miui12.5增强版的介绍 反正介绍了半天,吹的很牛啊 同时官方也发布了相应的推送公告,但是等了很久一直不更新,看来只能自己动手了 1.获得miui12 ...

  4. 华为云大数据存储的冗余方式是三副本_大数据显示华为云DDS增强版实感卓越

    数据库.操作系统.中间件并称为核心基础软件,在 IT 软件堆栈中起到中流砥柱的作用.今天运行的绝大多数企业应用软件都离不开数据库的支持. 随着移动互联网.物联网.云计算.大数据等新技术爆发式发展,图片 ...

  5. 将表里的数据批量生成INSERT语句的存储过程 增强版

    原文:将表里的数据批量生成INSERT语句的存储过程 增强版 将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的 ...

  6. MySQL:讨人喜欢的 MySQL replace into 用法(insert into 的增强版)

    讨人喜欢的 MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果 ...

  7. Facebook增强版LASER开源:零样本迁移学习,支持93种语言

    来源| Facebook AI 研究院 译者 | Linstancy 责编 | 琥珀 出品 | AI 科技大本营(ID:rgznai100) [导语]为了加速自然语言处理 (NLP) 在更多语言上实现 ...

  8. P1276 校门外的树(增强版)(线段树)(校门三部曲)难度⭐⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  9. QUARK的增强版C-QUARK问世,有效提升蛋白质结构从头预测精度

    2021年8月18日,密西根大学张阳教授团队在Nature Communications上发表论文"Improving fragment-based ab initio protein st ...

最新文章

  1. 单片机蓝牙初始化_单片机程序那些事
  2. 如何从Silverlight 代码调用Javascript 函数
  3. 牛人推荐的跨浏览器兼容性总结
  4. mysql5.5.30源码安装及主从搭建
  5. linux vg lv pv
  6. Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)
  7. 桌面图标设计里的计算机是灰色的,小技巧教您如何将Windows 10上的桌面图标设置中的回收站为灰色!...
  8. 操作系统作业3 xv6 CPU alarm
  9. mysql group日期_MySQL GROUP BY使用datetime时的日期?
  10. c语言中用double写圆的面积,用java写一个函数area,接收一个double类型的参数(表示圆的半径r),用于计算圆的面积...
  11. 最新第一波:全国信息化工程师软考-系统集成项目管理工程师(高级案例高分论文)
  12. 虚拟内存设置(可扩展板载内存)
  13. 领导的本质就是:管理自己,影响别人
  14. 吴恩达深度学习学习笔记——C1W2——神经网络基础——练习题
  15. 看图猜地理-黑龙江篇
  16. 月影无终的伤感日志最新推荐:搁浅的回忆,谁来承受
  17. 如何设计一个简单的网页
  18. 使用API进行FTP文件上传和下载
  19. 不同网段间访问共享文件
  20. 大题历年题合集-信息资源管理

热门文章

  1. 私有云、公共云、混合云
  2. 华丽转身——如何从技术岗位走向管理岗位
  3. byr_filesys图床
  4. 解读FAT32分区文件系统
  5. get.(Calendar.HOUR_OF_DAY)、get(Calendar.HOUR)的区别
  6. 清华计算机文化基础网站,数据库基础知识清华大学计算机文化基础
  7. 数据结构_队列:从普通队列到循环(circular)队列
  8. 0108 JQuery
  9. 外汇交易规则有哪些?
  10. 我的世界、DotA IMBA常用游戏指令