CF1988D The Omnipotent Monster Killer
CF1988D The Omnipotent Monster Killer
本文同步于我的网站。
Problem
怪物们在一棵有 \(n\) 个顶点的树上,编号为 \(i(1\le i\le n)\) 的怪物位于编号为 \(i\) 的顶点上,攻击力为 \(a_i\) 。你需要与怪物战斗 \(10^{100}\) 个回合。在每个回合中,会依次发生以下两步:
- 所有活着的怪物攻击你。你的生命值会按照所有活体怪物攻击点的总和减少。
- 您选择一些(可以选全部,也可以不选)怪物并杀死它们。被杀死的怪物将不会再进行攻击。
限制条件:在一个回合内不能杀死相邻的两只怪物。
如果您以最佳选择方式攻击的怪物,那么在所有回合后,您的健康值减少的最小值是多少?
\(1\le t\le 10^4,1\le n\le 3\cdot 10^5,1\le a_i \le 10^{12},\sum n\le 3\cdot 10^5\)
Solution
这是一道再经典不过的树形DP了。太惭愧了。
每个节点的贡献可以表示为 \(w_i\cdot a_i\) 的形式,其中 \(w_i\) 表示怪物 \(i\) 是第 \(w_i\) 次被杀死的。可以证明 \(w_i\) 不会超过 \(\log_2(n)\) 。
图:Taibo
上图中,欲构造出 \(w_i=x\) 的点,需要将该点连接上 \(w=1,2,\dots,x-1\) 的节点。设构造出 \(\max w_i=n\) 的树至少需要 \(tot_n\) 个节点,则存在
tot_n=
\begin{cases}
& 1 & n=1\\
& \sum_{i=1}^{n-1}tot_i +1 & n\ge 2
\end{cases}
\end{gather}
\]
即得 \(tot_n=2^n\) 。也就是说对于一张 \(n\) 个节点的图,其至多需要 \(\log_2(n)\) 次选择就可以将所有怪物杀死。
下面开始dp。设 \(dp_{x,k}\) 表示若第 \(k\) 次杀死怪物 \(x\) , \(x\) 子树内的怪物至少会产生多少点伤害。
\(dp_{x,k}\) 由两部分组成:
- 在第 \(k\) 次杀死怪物 \(x\) 之前,怪物 \(x\) 会产生 \(k\cdot a_x\) 点伤害。
- \(x\) 的子树内的怪物(除了 \(x\) 本身)产生的伤害。
dp_{x,k}=k\cdot a_x + \sum_{y\in u(x)}\min_{j\not =k} dp_{y,j}
\end{gather}
\]
其中 \(u(x)\) 表示点 \(x\) 的儿子节点。
最后答案为 \(\min dp_{root,k}\)
Code
#define N 300010
int n;
int head[N],nxt[N*2],ver[N*2],cnt;
void insert(int x,int y)
{
nxt[++cnt]=head[x];
head[x]=cnt;
ver[cnt]=y;
}
LL a[N];
#define K 25
#define inf (1ll<<62)
LL dp[N][K+5];
void dfs(int x,int f)
{
for(int i=1;i<=K;i++)
{
dp[x][i]=a[x]*i;
}
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(y==f) continue;
dfs(y,x);
for(int j=1;j<=K;j++)//点x将被第j次选
{
LL mn=inf;
for(int k=1;k<=K;k++)//相邻点y将被第k次选
{
if(j!=k)
{
mn=min(mn,dp[y][k]);
}
}
dp[x][j]+=mn;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout.precision(10);
int t=1;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
int x,y;cin>>x>>y;
insert(x,y);
insert(y,x);
}
dfs(1,0);
LL ans=inf;
for(int i=1;i<=K;i++)
{
ans=min(ans,dp[1][i]);
}
cout<<ans<<endl;
for(int i=1;i<=cnt;i++)
{
head[i]=nxt[i]=ver[i]=0;
}
cnt=0;
}
return 0;
}
CF1988D The Omnipotent Monster Killer的更多相关文章
- OOM killer
Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 1. 为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行m ...
- 25 Killer Actions to Boost Your Self-Confidence
25 Killer Actions to Boost Your Self-Confidence Once we believe in ourselves, we can risk curiosity, ...
- 2015暑假多校联合---Problem Killer(暴力)
原题链接 Problem Description You are a "Problem Killer", you want to solve many problems. Now ...
- 3098: Hash Killer II
3098: Hash Killer II Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1219 Solved: ...
- Android反编译工具的使用-Android Killer
今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...
- Android进程回收机制LMK(Low Memory Killer)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...
- hdu4950 Monster (水题)
4950 Monster Monster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- codeforces 487A A. Fight the Monster(二分)
题目链接: A. Fight the Monster time limit per test 1 second memory limit per test 256 megabytes input st ...
- Android内存管理机制之一:low memory killer
转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...
- 理解和配置 Linux 下的 OOM Killer
原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...
随机推荐
- CICFlowMeter 使用方法
前言 因实验需要提取流量特征,就找到了这个较为著名的流量特征提取工具 CICFlowMeter .例如 CIC-IDS-2017 数据集就是通过这个工具提取而来. 网络上的教程众说纷纭,但我始终是无法 ...
- 2024数证杯决赛团体赛wp
2024数证杯决赛团体赛wp 容器密码:mW7@B!tRp*Xz46Y9#KFUV^J2&NqoHqTpLCE%8rvGW(AX#1k@YL3$M5!bWY*9HLFq7UZR6^T!XoVm ...
- Qt Qss 设置QPushButton图标和背景
文章目录 Qt QSS 设置 QPushButton的图标叠加背景 前言 解决方法 background-repeat.background-position 最终样式 Qt QSS 设置 QPush ...
- 告别手动敲代码!VSCODE 风格在线可视化开发平台,效率飙升!
2025 年 2 月 21 日消息,对于广大开发者而言,今天迎来一则重大利好消息!一款操作布局与 VSCODE 极为相似的可视化开发神器 --Joker 智能可视化开发平台正式上线.无论你是深耕前端领 ...
- 堆排序(标准版)(NB)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import random def sift(li, low, high): # ...
- Oracle删除用户及用户下的全部数据
1.查看用户 select * from all_users select * from user_users select * from dba_users 2.查看用户的连接状况 select ...
- 跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
非常详细,傻瓜式依葫芦画瓢即可. 特别提示:订阅机器上的防火墙以及发布机器远程登录订阅机的问题 通过非命令行方式配置同步订阅 (1)实验环境说明 (2)实验前准备 (3)订阅设置 (4)测试同步订阅 ...
- Apache DolphinScheduler 3.3.0 Alpha发布,功能增强与性能优化大升级!
近期,Apache DolphinScheduler进行了版本更新,发布了3.3.0 alpha版本.Apache DolphinScheduler 3.3.0 alpha版本在任务管理.容错能力.扩 ...
- 记录 Windows关闭自动更新
- C 冒泡排序和选择排序
冒泡排序 理论概念: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较,比如说是从小到大的排序,要是后面的数比前面的小则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二 ...