【题目背景】
于万人中万幸得以相逢,刹那间澈净明通。
成为我所向披靡的勇气和惶恐,裂山海,堕苍穹。
爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中。
韶华宛转吟诵,苍凉的光荣,急景凋年深情难共。
——银临《不老梦》
【问题描述】
扶苏翻遍了歌单却没有找到一首歌能做这个题的题目背景,于是放上了扶苏最喜欢
的一首《不老梦》。
与 Day1 的第二题一样,今天的第二题依然是一道树论题。
我们定义一棵 n 个节点的树为一个有 n 个节点和 n-1 条边的无向连通图。
如果我们定义 u 是一颗树 T 的根,那么任意一个节点 v 到根的路径就是从 v 出发到
达点 u 的简单路径上所经过的点的点集。可以证明这样的简单路径有且仅有一条。
定义一个节点 x 是节点 y 的孩子,当且仅当 x 和 y 之间有边相连且 x 不在 y 到根的
路径中。如果 x 是 y 的孩子,那么定义 y 是 x 的家长节点。
如果我是 _rqy 那种毒瘤神仙的话,可能会问你每个节点的孩子数不超过 k 的 n 个节
点的带标号无根树一共有多少个,可惜这个问题我也不会,所以我不会问你这么毒瘤的
问题。
扶苏从一颗 n 个节点的树的 1 号节点出发,沿着树上的边行走。当然我们约定 1 号
节点是这棵树的根。他所行走的规定是:当扶苏在点 u 时,扶苏要么在 u 的孩子中选择
一个没有到达过得点 v 并行走到 v,要么选择回到 u的家长节点。
现在给每个节点一个权值 w,其中 i 号节点的权值为 wi。扶苏有一些石子,他想给
这棵树上的某一个节点放上石子。我们规定扶苏能在节点 u 放上石子当且仅当满足如下
条件:
1、扶苏当前在节点 u
2、对于 u 的所有孩子节点v,节点 v 被放上了 wv 颗石子。
但是,扶苏在任意时刻都可以取回任意节点的石子。
现在,扶苏想问问你对于每个节点,如果他想在 i 号节点上放 wi 颗石子,那么他一
开始需要准备多少石子。
【输入格式】
输入文件名为 yin.in。
输入文件中有且仅有一组数据,数据的第一行是一个整数 n 代表树的节点个数。
第二行有 n-1 个整数,第 i 个整数 pi 代表 i+1 号节点的家长节点的编号。
第三行有 n 个整数,第 i 个整数代表 wi。
【输出格式】
输出文件名为 yin.out。
输出一行 n 个整数,第 i 个整数代表想在 i 号节点上放 wi 颗石子需要准备的
石子个数。
 
【输入输出样例 1】
in
3
1 2
1 1 1
out
2 2 1
 
解释:
        

样例 1 的输入如左图,每个节点都需要放 1 块石头。
如果在 1 号节点放石头,则从一号点运动到 2号点,然后运动到 3 号点,在 3 号点上放一块
石头,返回 2 号点,在 2 号点上放一块石头,同时收回三号点的石头,然后返回 1 号点,将从 3 号点收回的石头放到 1 号点即可。一共需要两块石头。
在 2、3 号节点放石头的方案类似。 
 
【输入输出样例 2】
in
3
1 1
1 1 1
out
3 1 1
【输入输出样例 3】
in
6
1 1 2 3 4
3 14 1 5 12 15
out
21 20 13 20 12 15 
 

样例 3 的输入如左图。
先从 1 号节点运动至 3 号节点,再运动至 5 号节点,在 5 号节点上放置 12 块石子,然后返回 3 号节点,在 3 号节点上放置 1 块石子,收回五号节点的 12块石子,返回 1 号节点。
然后运动到 2 号节点,通过 4 号节点运动到 6 号节点,放下 15 颗石子,返回 4 号节点放下 5 颗石子,时树上有的石子数为5(4号)+15(6号)+1(3号)=21颗。然后收回 6 号节点的石子,返回 2 号节点,放下 14 颗石子,收回 4 号节点的,返回 1 号节点,在 1 号节点上放置 3 颗石子,即可达到在 1 号节点上放石子的目的。
可以验证最大花费为 21。其他节点的答案同理。
              
【题解】
测试点 1: 显然直接输出 w1 即可。期望得分 5 分。
测试点 2-5: 爆搜,搜出一个放石子的顺序,然后 O(n) 的 check 是否合法(看看是否父亲在儿子的前面)。时间复杂度 O(n!n)。期望得分 20 分。 
 
测试点 6-7:
注意到根据题目规定的走法,在进入一个节点以后,必须遍历完它的整个子树,否则一旦离开这个节点,再也无法进入这棵子树,从而导致该节点的某个孩子没能放上石子,导致这个节点不能放上石子。同时又有每个节点放上石子以后,它的子树的石子可以全部取回。设在节点 u 放石子需要有 ansu 个石子,则放完 u 以后可以取回ansu-wu 个石子。
于是考虑影响问题答案的显然是从 u 进入每个孩子的顺序,由于最多有两个孩子,直接比较一下就可以知道先进入哪个孩子更优秀了。时间复杂度 O(n),期望得分10 分。 
测试点 8-10:
延续上一组测试点的思路,由于只有最多 5 个孩子,可以直接爆搜选孩子的顺序,看看哪个更优秀。时间复杂度 O(n×x!),其中 x=5。期望得分 15 分。 
测试点 11-14:
树高最多为 3。考虑进入第 3 层时由于不能回收石子,所以进入第三层的顺序无所谓,即对于第 2 层的每个节点 u,都有 ∑ v∈cld[u]Wv。现在只需要考虑从 1 号节点进入它的所有孩子节点的顺序即可。 
考虑走完节点 u 的所有孩子 v 所需要的总石子数 cu,显然是越少越好。证明如下:
走完所有孩子后,所花费的总石子数不变,设剩下的石子(也就是所需要的减去所花费的)为 ret,注意到当 cu 最小的时候即是 ret 最小的时候。考虑当 ret ≥ wu的时候,直接用 ret 放下 u 上的石子,于是放石子在节点 u 的总花费就是 cu,后者越小越好。 
当 ret < wu 的时候,用剩下的石子放在 u 上,然后再额外放上去一些石子,这样做的花费是wu+∑ v∈cld[u]Wv,这显然是最小的花费,考虑当 cu 越小 ret 才越小,cu 取最小时显然能取到最优情况。 
综上,可以尽可能使 cu 减小,来达到最优解。
那么问题变成了:
有 x 个商品,购买第 i 个物品需要手里有 ansi 元钱,花费 wi 元。求一个顺序使得购买所有商品所需要的钱数最少。
这个问题的最最优顺序是按照 ansi-wi 不升序购买,也就是差值越大越要先买。
证明:
设有两个物品 i,j,设 ai=ansi-wi,aj=ansj-wj。(放完i之后可以收回的石子数)且 ai>aj。考虑先买 i 再买 j 的花费是max(ansi, wi+ansj) ①,同理先买 j 的花费是 max(ansj, wj+ansi) ②。
提出 w,则 ①=wi+max(ai,ansj),②=wj+max(aj,ansi)=wj+max(aj,ai+wi)=wj+ai+wi
考虑 ① 式的 max 如果取前面一项,则 ①=wi+ai<②,如果取后面一项则 ①=wi+ansj=wi+aj+wj<②,于是无论怎么取,①式恒小于②式,于是先买 i 更优。数学归纳可得按照 ansi-wi 不升序购买最优。
于是按照这个顺序,排一遍序即可。期望得分 20 分。
测试点 15-20:
可以发现上面的结论同样适用于树高更高的情况,于是在 dfs 回溯的时候对子节
点排序,即可算出该节点的答案,期望得分 30 分。

下面是代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=; int n;
int mu[maxn],ans[maxn];
vector<int>son[maxn]; inline bool cmp(int a,int b)
{
return (ans[a]-mu[a])>(ans[b]-mu[b]);
}//不升序 void dfs(int u)
{
for(int v=;v<son[u].size();v++)
{
dfs(son[u][v]);
}//每一个节点都要搜
sort(son[u].begin(),son[u].end(),cmp);//排序
int ret=;//走完所有的孩子后剩下的石子
for(int v=;v<son[u].size();v++)
{
if(ret>=ans[son[u][v]])//如果剩下的还够
{
ret-=ans[son[u][v]];//从剩下的里面减去
}
else//如果剩下的不够
{
ans[u]+=ans[son[u][v]]-ret;//更新ans
ret=ans[son[u][v]]-mu[son[u][v]];
//更新剩下的石子(就是可以取回的)
}
}
ans[u]+=max(,mu[u]-ret);//更新答案
} int main()
{
n=read();
for(int i=,x;i<=n;i++)
{
x=read();
son[x].push_back(i);//标记x的儿子
}
for(int i=;i<=n;i++)
{
scanf("%d",mu+i);//mu+i表示mu[i]的地址
}
dfs();//开搜
for(int i=;i<n;i++)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[n]);
return ;
}

模拟赛DAY 2 T2不老梦的更多相关文章

  1. 【6.24校内test】T2 不老梦

    [题目背景] 于万人中万幸得以相逢,刹那间澈净明通. 成为我所向披靡的勇气和惶恐,裂山海,堕苍穹. 爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中. 韶华宛转吟诵,苍凉的光荣,急景凋年深情难共. ——银临 ...

  2. NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  3. 2.17NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  4. NOIP 模拟赛 那些年,我们学过的文化课 --致已退役的fqk神犇.

    /* 这大概是我第一次整理模拟赛吧. 唉. T2打了很长时间. 一开始读错题了中间都能缩合了. 真心对不起生物老师hhh. 这种状态判重的题目还是做的太少! */ 背单词 [题目描述] fqk 退役后 ...

  5. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  6. 2014-9-9 NOIP模拟赛

    东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时 ...

  7. NOIP模拟赛 17.10.10

    初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...

  8. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  9. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

随机推荐

  1. P5016龙虎斗

    这道题是2018年普及组的第二题,是一个模拟题. 首先计算出双方各自的势力,然后将增援的队伍势力加上,比较此时双方势力,并且作差,最后枚举将公平兵加在哪一个兵营.看似简单的题被我20分钟就写完了,但是 ...

  2. 堆”,"栈","堆栈","队列"以及它们的区别

    如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...

  3. Redis哨兵功能与集群搭建

    6.redis哨兵功能 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机, ...

  4. P2586 [ZJOI2008]杀蚂蚁

    传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...

  5. [七月挑选]树莓派Raspberrypi上配置Git

    title: 树莓派Raspberrypi上配置Git 树莓派Raspberrypi上配置Git. 开始 首先你得有一树莓派!!! 过程 查看自己树莓派的版本 pi@raspberrypi:~ $ u ...

  6. 显示本机 Linux 系统上所有开放的端口列表

    #!bin/bash#作者:liusingbon#功能:从端口列表中观测端口,关闭无用端口对应的服务,降低被意外攻击的可能性ss -nutlp |awk '{print $1,$5}' |awk -F ...

  7. Zabbix--03 邮件报警、微信报警

    目录 一. 邮件报警 1.定义发件人 2.定义收件人 3.优化告警信息 二. 微信报警 1.查看配置文件里的脚本目录路径 2.将weixin.py放在zabbix特定目录 3.配置发信人 4.配置收信 ...

  8. Python实现IP地址归属地查询

    一.使用淘宝IP地址库查询 使用淘宝的Rest API,可以快速查询IP地址的归属地: 图00-淘宝IP地址库RestAPI使用说明 图01-使用淘宝免费IP地址库-查询IP归属地 存在问题:淘宝的免 ...

  9. zabbix 安装中文无法显示的问题

    vi /usr/share/zabbix/include/locales.inc.php把zh_CN后面参数写true 然后去选择语言吧. 如果,去选择语言的时候,你发现还是不能选择....提示:Yo ...

  10. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...