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

n≤105n\leq 10^5n≤105,所有战斗防御小于攻击。

由于不能加攻击,所以打败一个怪物受到的攻击次数是固定的,算出来记为 kik_iki​,奖励宝石记为 bib_ibi​。而每获得一个宝石可以让之后的所有怪物减伤 kik_iki​。

先考虑菊花图,也就是没有顺序限制。

考虑一个解 {p1,p2,p3,…,pn}\{p_1,p_2,p_3,\dots,p_n\}{p1​,p2​,p3​,…,pn​} ,如果交换 pi,pi+1p_i,p_{i+1}pi​,pi+1​ 让解变优,即

dkpi+(d+dpi)kpi+1<dkpi+1+(d+dpi+1)kpidk_{p_i}+(d+d_{p_i})k_{p_{i+1}}<dk_{p_{i+1}}+(d+d_{p_{i+1}})k_{p_i}dkpi​​+(d+dpi​​)kpi+1​​<dkpi+1​​+(d+dpi+1​​)kpi​​

dpikpi<dpi+1kpi+1\frac{d_{p_i}}{k_{p_i}}<\frac{d_{p_{i+1}}}{k_{p_{i+1}}}kpi​​dpi​​​<kpi+1​​dpi+1​​​

所以在没有先决条件的情况下,按 diki\frac{d_i}{k_i}ki​di​​ 从小到大排序一个个选就可以了。定义性价比为 ci=dikic_i=\frac{d_i}{k_i}ci​=ki​di​​。

考虑树的情况,删除点 uuu 后,要么继续删儿子,要么删其他点废话

如果 uuu 性价比最高的儿子 vvv 性价比比 uuu 高,那么显然一定会继续删 vvv 。

所以我们可以把 u,vu,vu,v 合并成一个点, d、kd、kd、k 相加重新计算性价比。这时候 uuu 的其他儿子需要与合并后的点比较。

实现的时候把所有怪物压进按性价比排序的大根堆,每次选出最大的,如果父亲性价比比它低(也就是还在堆里)就和父亲合并,否则删掉这个点所在的大点,可以用并查集实现。

复杂度 O(nlog⁡n)O(n\log n)O(nlogn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <queue>
#include <vector>
#include <utility>
#define MAXN 100005
using namespace std;
typedef long long ll;
inline ll read()
{ll ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
vector<int> e[MAXN],son[MAXN];
int bns[MAXN],cnt[MAXN],a[MAXN],b[MAXN],k[MAXN];
int fa[MAXN],rt[MAXN];
int find(int x){return rt[x]==x? x:rt[x]=find(rt[x]);}
typedef pair<double,int> pi;
priority_queue<pi> q;
ll pb,pa,pd;
int vis[MAXN],del[MAXN];
void dfs(int u,int f){fa[u]=f;for (int i=0;i<(int)e[u].size();i++) if (e[u][i]!=f) dfs(e[u][i],u);}
void dfs(int u)
{pb-=(a[u]-pd)*cnt[u],pd+=bns[u],del[u]=1;for (int i=0;i<(int)son[u].size();i++) dfs(son[u][i]);
}
int main()
{int n=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();e[u].push_back(v),e[v].push_back(u);}pb=read(),pa=read(),pd=read();for (int i=2;i<=n;i++){int bl,d;bl=read(),a[i]=read(),d=read(),bns[i]=b[i]=read();cnt[i]=k[i]=(bl-1)/(pa-d);}dfs(1,0);for (int i=2;i<=n;i++) q.push(make_pair(1.0*b[i]/k[i],rt[i]=i));del[1]=1;while (!q.empty()){int u=q.top().second;q.pop();if (vis[u]) continue;vis[u]=true;if (del[fa[u]]) dfs(u);else{int f=find(fa[u]);k[f]+=k[u],b[f]+=b[u];son[rt[u]=f].push_back(u);q.push(make_pair(1.0*b[f]/k[f],f));}}if (pb<=0) pb=-1;cout<<pb;return 0;
}

【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】相关推荐

  1. 2021牛客训练营 F.魏迟燕的自走棋(贪心并查集)

    传送门 费用流会 T T T,但是没试过 H K HK HK之类的 STD 设武器作用于 x , y x,y x,y两个人(如果 k = 1 k=1 k=1那么令 x = y x=y x=y),收益为 ...

  2. 【牛客 - 1080B】tokitsukaze and Hash Table(STLset,并查集,Hash)

    题干: 链接:https://ac.nowcoder.com/acm/contest/1080/B 来源:牛客网 tokitsukaze有n个数,需要按顺序把他们插入哈希表中,哈希表的位置为0到n-1 ...

  3. 【牛客NOIP模拟】牛半仙的妹子序列【DP】【Segment Tree Beats】

    题意:排列的极长上升子序列个数 n≤2×105n\leq 2\times 10^5n≤2×105 显然有个 dp fn=∑i<n,pi<pn,∄i<j<ns.t. pi< ...

  4. 【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

    题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​,从 (1,1)(1,1)(1,1) ...

  5. 【牛客NOIP模拟】路径难题【建图】【最短路证明】

    题意:一张 nnn 个点 mmm 条边的无向图,边带距离,可以坐出租车,花费为距离除以常数 rrr 向上取整:也可以坐公交车,每路车行驶路线给定,无论坐多少站花费都为 cic_ici​ (每路车可能不 ...

  6. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树

    链接:https://ac.nowcoder.com/acm/contest/7608/C 来源:牛客网 牛半仙有 n​ 个妹子,她们所在的位置组成一棵树,相邻两个妹子的距离为 1​. 有 m​ 个妹 ...

  7. 牛客NOIP暑期七天营-提高组1

    牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...

  8. 牛客网大厂在线笔试输入输出练习python3版

    牛客网大厂在线笔试输入输出练习python3版 写在前面 1 解法一: 解法二:(错误解法) 2 解法一 解法二:错误解法 解法三 3 解法一 解法二 4 解法一 解法二 5 解法一 解法二 解法三 ...

  9. 【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

    未完待续... T1:牛牛的方程式 title solution code T2:牛牛的猜数游戏 title solution code T3:牛牛的凑数游戏 title solution code ...

最新文章

  1. 报告 | 中国科学院发布地球大数据报告
  2. 韩系春装搭配 穿出优雅气质
  3. 关于LCD的分屏与切屏 Tearing effect
  4. Outlook应用指南(1)——数据备份还原技巧
  5. error:use of undeclared identifier
  6. 开发VUE使用第三库,发现有bug怎么办?
  7. jquery ajax.then,jQuery动态AJAX Promise链
  8. springmvc中@RequestMapping的使用
  9. mysql正在加载_mysql 数据库基本操作
  10. 无序列表圆点变空心_前端HTML -- 列表标签
  11. GNN | 最新2022综述
  12. asp.net中如何解决4M以上文件的上传
  13. 鸿蒙os framework,疯壳-鸿蒙OS-HDF驱动框架
  14. linux安装vnc
  15. 显示器刷新率测试软件144,【显示器】为什么“吃鸡”要选144Hz显示器?详解高刷新率显示器对FPS游戏的重要影响...
  16. php对联广告,js 左右悬浮对联广告代码示例
  17. 【Bandit Algorithms学习笔记】EXP3算法理论证明
  18. Charles接口模拟404/502
  19. 桌面虚拟化技术介绍和对比
  20. Nginx 动静分离 -02

热门文章

  1. 面对焦虑,我们能做什么?
  2. 指定的文件不是虚拟磁盘 没有快照_vmware workstaiton 15 虚拟机克隆(4)
  3. java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
  4. 3dmax导出x文件插件2020_C4D与unity3D,3DMAX,AI,AE,ks之间互导
  5. linux 逻辑卷 pe size 4.00 mib大小怎么改,linux逻辑卷的建立
  6. 有必要服务器虚拟化吗,服务器虚拟化有必要吗
  7. 链接服务器 慢_redis服务器cpu100%的原因和解决方案
  8. cad必练10张图_CAD比例问题大详解!赶紧收藏!
  9. php 常用rpc框架,php的轻量级rpc框架yar
  10. windows server 启用 vss_windows服务器常用的安全加固方法