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 无缘无故挂掉,还有 ...
随机推荐
- javascript快速初始化数组
编写代码中通常会有快速初始化数组的需求,例如我们需要一个类似matlab里的zeros函数,假如这里我们需要生成一个0-23的数组用于表示一天24小时. 最基本的做法如下: function(){ l ...
- Ansible忽略任务失败
在默认情况下,任务失败时会中止剧本任务,不过可以通过忽略失败的任务来覆盖此类行为.在可能出错且不影响全局的段中使用ignore_errors关键词来达到目的. 环境: 受控主机清单文件: [dev] ...
- pandas(进阶操作)-- 政治献金项目数据分析
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- Pydantic异步校验器深:构建高并发验证系统
title: Pydantic异步校验器深:构建高并发验证系统 date: 2025/3/25 updated: 2025/3/25 author: cmdragon excerpt: Pydanti ...
- Docker中的Gitlab数据迁移
一.选择版本 GitLab 12.2或更高版本: docker exec -t gitlab-backup create GitLab 12.1和更早版本: gitlab-rake gitla ...
- .NET 原生驾驭 AI 新基建实战系列(二):Semantic Kernel 整合对向量数据库的统一支持
1. 引言 在人工智能(AI)应用开发迅猛发展的今天,向量数据库作为存储和检索高维数据的重要工具,已经成为许多场景(如自然语言处理.推荐系统和语义搜索)的核心组件. 对于.NET生态系统的开发者而言, ...
- 🎀idea - properties文件unicode中文显示
简介 idea中properties文件中文默认展示为unicode码 unicode 中文展示为 \u开头的ASCII 调整中文显示 idea -> settings -> Editor ...
- Navicat Premium 16激活教程(NavicatCracker)
1.安装Navicat Premium 16 (注意版本,这里以此版本为例):并下载激活工具 1.1.Navicat Premium 下载路径: http://www.navicat.com.cn/d ...
- C#/.NET/.NET Core技术前沿周刊 | 第 34 期(2025年4.7-4.13)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- eolinker校验规则之 Json Path定位:返回值内有多项同类参数,检验其中一个参数值
比如创建商品后,查询商品是否生成,执行完创建商品接口后就需要再执行查询商品接口. 查询接口查询出来的数据可能包括所有商品数据或者有同名商品数据,所有整个返回结果内可能包含多个同名不同商品id的数据 往 ...