2020ICPC南京 M.Monster Hunter
题目大意
一颗根为 \(1\) 的有 \((2≤≤2000)\) 个节点的树,每个节点有一个权值 \(ℎ_{} (1≤ℎ_{}≤10^9)\) ,能删除某个点的前提是其父亲节点已经被删除,并且删除一个节点的费用为 \(ℎ_{}+∑_{∈[]}ℎ_{}\) ,有 \(\) 次使用魔法的机会,每次使用可以免费并且无视限制条件地删去 \(1\) 个节点。分别求出当 \(=0\sim \) 时,删除全部节点所需要的最小花费。
思路
代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define all(x) x.begin(),x.end()
#define int LL
//#define lc p*2+1
//#define rc p*2+2
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const double eps = 1e-8;
const LL mod = 1000000007;
const LL MOD = 998244353;
const int maxn = 2010;
int T, N;
vector<int>G[maxn];
int vsize[maxn];
int hp[maxn], dp[maxn][maxn][2];
void add_edge(int from, int to)
{
G[from].push_back(to);
}
void dfs(int v)
{
vsize[v] = 1;
dp[v][0][0] = hp[v], dp[v][1][1] = 0;
for (int i = 0; i < G[v].size(); i++)
{
int to = G[v][i];
dfs(to);
for (int j = vsize[v]; j >= 0; j--)
{
for (int k = vsize[to]; k >= 1; k--)
{
if (j < vsize[v])
dp[v][j + k][0] = min(dp[v][j + k][0], dp[v][j][0] + min(dp[to][k][0] + hp[to], dp[to][k][1]));
if (j > 0)
dp[v][j + k][1] = min(dp[v][j + k][1], dp[v][j][1] + min(dp[to][k][0], dp[to][k][1]));
}
dp[v][j][0] += min(dp[to][0][0] + hp[to], dp[to][0][1]);
dp[v][j][1] += min(dp[to][0][0], dp[to][0][1]);
}
vsize[v] += vsize[to];
}
}
void solve()
{
dfs(1);
for (int i = 0; i <= N; i++)
{
if (i < N)
printf("%lld ", min(dp[1][i][0], dp[1][i][1]));
else
printf("%lld\n", min(dp[1][i][0], dp[1][i][1]));
}
}
signed main()
{
scanf("%lld", &T);
while (T--)
{
//cnt = 0;
scanf("%lld", &N);
for (int i = 0; i <= N; i++)
{
for (int j = 0; j <= N; j++)
dp[i][j][0] = dp[i][j][1] = INF;
}
for (int i = 1; i <= N; i++)
G[i].clear();
int fa;
for (int i = 2; i <= N; i++)
{
scanf("%lld", &fa);
add_edge(fa, i);
}
for (int i = 1; i <= N; i++)
scanf("%lld", &hp[i]);
solve();
}
return 0;
}
2020ICPC南京 M.Monster Hunter的更多相关文章
- HDU暑假多校第三场H.Monster Hunter
一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...
- Day3-A-Problem H. Monster Hunter HDU6326
Little Q is fighting against scary monsters in the game ``Monster Hunter''. The battlefield consists ...
- HDU 6326 Problem H Monster Hunter
\(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...
- [HDU6326]Monster Hunter(贪心)
用(a,b)表示一个点先失去a点HP,然后增加b点HP 首先容易证明忽略父亲条件下,任意两个点,先吃b大的最优 对于一个节点v和它的父节点u,若此时选v最优,那么就是吃到u时可以立即吃掉v, 于是可以 ...
- [hdu6326]Monster Hunter
考虑树是以1为中心的菊花图的情况,也即如何安排打怪兽的顺序 用二元组$(a,b)$来描述怪兽,则对于两个怪兽$(a_{1},b_{1})$和$(a_{2},b_{2})$,交换两者不会影响血量的变化量 ...
- HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)
6326.Problem H. Monster Hunter 题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP.求从 1 号点出 ...
- 2018 Multi-University Training Contest 3 - HDU Contest
题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2018 Multi-University Training Contest 3 Solution
A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...
随机推荐
- java匿名内部类-应用
1 package face_09; 2 3 import sun.jvm.hotspot.ui.action.ShowAction; 4 5 interface Inter{ 6 void show ...
- MySQL数据库本地事务原理
在经典的数据库理论里,本地事务具备四大特征: 原子性 事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败: 一致性 事务执行前后,所有的数据都应该处于一致性状态---即要满足数据库表的 ...
- linux磁盘管理(全面解析)
目录 一:磁盘管理 1.磁盘管理作用 2.磁盘挂载顺序 3.磁盘分区 4.Linux 磁盘管理常用命令 5.磁盘分区内容 二:linux中分区的意义 三:分区的步骤与顺序 1.添加磁盘 2.查看创建新 ...
- maven常用打包命令
常用maven命令 执行与构建过程(编译,测试,打包)相关的命令必须进入pom.xml所在位置执行 mvn clean:清理(打包好的程序放在生成的名为target的文件中,清理即删除文件中打包好的程 ...
- JVM专题2: JVM内存结构
合集目录 JVM专题2: JVM内存结构 Java 内存分配 JVM 内存结构 The JVM is an abstract computing machine that enables a comp ...
- 同态加密与 Paillier/RSA
本文作者: wdxtub 本文链接: http://wdxtub.com/flt/flt-03/2020/12/02/ 白话同态加密 虽然同态加密即使现在听起来也很陌生,但是其实这个概念来自 1978 ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...
- 2020-9-29 T3
题意:给定一颗大小为 \(n(n \le 5 \times 10 ^ 4)\) 的树,保证树的生成方式随机,你需要选定两个点 \(x, y\),最小化: \[\sum\limits_{i = 1} ^ ...
- Linux中Swap与Memory内存简单介绍 (转)
https://blog.csdn.net/zwan0518/article/details/12059213 一.背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇 ...
- foreEach 跳出循环
const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; const _ = require('lodash'); let outArr = []; try { arr. ...