【题目背景】

于万人中万幸得以相逢,刹那间澈净明通。

成为我所向披靡的勇气和惶恐,裂山海,堕苍穹。

爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中。

韶华宛转吟诵,苍凉的光荣,急景凋年深情难共。

——银临《不老梦》

【问题描述】

扶苏翻遍了歌单却没有找到一首歌能做这个题的题目背景,于是放上了扶苏最喜欢 的一首《不老梦》。

与 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】这个显然没有任何的技术含量啦,直接输出w1就可以啦。5pts get√

【测试点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】(正解前导论,划重点)

【测试点15-20】可以发现上面的结论同样适用于树高更高的情况,于是在 dfs 回溯的时候对子节 点排序,即可算出该节点的答案,期望得分 30 分。

好了以下是充满了ZAY风起的STD(不用指针会死zay)

#include <cstdio>
#include <vector>
#include <algorithm> const int maxn = ; int n;
int MU[maxn], ans[maxn];
std::vector<int>son[maxn]; void dfs(const int u);
bool cmp(const int &_a, const int &_b); int main() {
freopen("yin.in", "r", stdin);
freopen("yin.out", "w", stdout);
scanf("%d", &n);
for (int i = , x; i <= n; ++i) {//直 接 i 从 2 开 始 枚 举,就 不 用 i+1 了
scanf("%d", &x);
son[x].push_back(i);//动 态 数 组 嘛 qwq
}
for (int i = ; i <= n; ++i) {
scanf("%d", MU + i);//指 针 可 海 星
}
dfs();
for (int i = ; i < n; ++i) {
printf("%d ", ans[i]);
}
printf("%d\n", ans[n]);
return ;
} void dfs(const int u) {
for (auto v : son[u]) {//遍历u结点的所有儿子,赋值给v
dfs(v);//先遍历所有儿子,最后再操作1
}
std::sort(son[u].begin(), son[u].end(), cmp);//将u结点的所有儿子按照ansi-wi不升序排序
int _ret = ;
//此时u结点所有的e子的ans都已经计算出来了
for (auto v : son[u]) {//对于叶子结点(没有e子),不进行这个for循环
//对于其它结点,
if (_ret >= ans[v]) {//显然由于遍历是有顺序的,当我们遍历到某些结点时,其之前遍历的
//结点的石子和(除去结点u的e子),(显然除了u结点所对应的儿子结点v们,这些v的儿子上的石子都可以删除啦)
//如果这些多出来的石子>某个未被遍历到的结点所需石子数,显然直接放过去就好了√
_ret -= ans[v];//这样剩余的石子就减少啦
//然后相当于ans[v]的贡献是0
} else {
ans[u] += ans[v] - _ret;//计算ans[u]:+它的e子结点所需要的石子-剩余石子
_ret = ans[v] - MU[v];//表示遍历完u的e子v这个结点对应滴子树后,可以收回除了u的e子v以外所有结点上的石头
//因此ret=ans[v]-MU[v]
}
}
ans[u] += std::max(, MU[u] - _ret);
//对于叶节点,ans[u]=0;
//对于其它结点
} inline bool cmp(const int &_a, const int &_b) {
return (ans[_a] - MU[_a]) > (ans[_b] - MU[_b]);//按照ansi-wi不升序排序
}

end-

【6.24校内test】T2 不老梦的更多相关文章

  1. 模拟赛DAY 2 T2不老梦

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

  2. 2019.6.24 校内测试 NOIP模拟 Day 2 分析+题解

    看到Day 2的题真的想打死zay了,忒难了QwQ~ T1 江城唱晚 这明显是个求方案数的计数问题,一般的套路是DP和组合数学. 正如题目中所说,这个题是一个 math 题.      ----zay ...

  3. 【7.24校内交流赛】T1&T2

    T1: 一个脑洞很大的题,将输入的所有数异或起来输出就好了: (话说我为什么这么喜欢用异或啊) #include<bits/stdc++.h> using namespace std; i ...

  4. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  5. 【6.24校内test】T1 江城唱晚

    [题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...

  6. 18清明校内测试T2

    一道数论好题(math) Time Limit:1000ms   Memory Limit:128MB 题目描述 rsy最近在研究欧几里得算法,不会的同学可以去看下课件以及代码…… 现在她想到了一个新 ...

  7. 2019.7.9 校内测试 T2 极值问题

    这一次是交流测试?边交流边测试(滑稽 极值问题 乍一看这是一道数学题,因为1e9的数据让我暴力的心退却. 数学又不好,不会化简式子嘞,咋办? 不怕,咱会打表找规律.(考场上真的是打表找出了规律,打表打 ...

  8. 2019.6.28 校内测试 T2 【音乐会】二重变革

    看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...

  9. 【6.24校内test】T3 棠梨煎雪

    [题目背景] 岁岁花藻檐下共将棠梨煎雪. 自总角至你我某日辗转天边. 天淡天青,宿雨沾襟. 一年一会信笺却只见寥寥数言. ——银临<棠梨煎雪> [问题描述] 扶苏正在听<棠梨煎雪&g ...

随机推荐

  1. GooFlow

    目前的下载网址:基于JQUERY的WEB在线流程图设计器GOOFLOW 0.7版

  2. jQuery_CSS类操作

    下面讲述jQuery操作css类,进行类的添加,移除,以及前两项功能的结合操作. <!DOCTYPE html> <html> <head> <meta ch ...

  3. 安装MongoDB到CentOS 6

    MongoDB是一个面向海量文档存数据动态存储的NoSQL型数据库.是一个除了用于关系型数据库如MySQL,PostgreSQL数据库表格的格式,和微软SQL以外的一种数据模型存储形式.他的功能包括了 ...

  4. F - Almost Sorted Array

    F - Almost Sorted Array   We are all familiar with sorting algorithms: quick sort, merge sort, heap ...

  5. apache的httpclient进行http的交互处理

    使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclient源码 ...

  6. Springboot 使用 webSocket

    介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进 ...

  7. 循环链表C语言实现

    按照单链表的设计,稍加改动.和单向链表不一样的地方,头节点不指向NULL,而是指向自己head 循环链表的判满 1)判断next是不是头结点,2)判断size /* * CycleLinkList.h ...

  8. python3笔记十九:os和ospath模块

    一:学习内容 os模块 ospath模块 获取指定目录下所有文件和目录 二:os模块 包含了普遍的操作系统功能,需要导入该模块:import os 当前所在位置目录结构为: 目录操作 1.获取当前目录 ...

  9. MSO Transponder 页面开发思路

    1. 确定Transponder开发页面分类,定义负责模块 2. 定义模块页面布局 3. 选择页面各数据对应的控件类型 4. 选定控件对应set/get所用方式 快捷键链接设置: http://www ...

  10. 微信、QQ第三方登录授权时的问题总结

    一.微信第一个问题:redirect_uri域名与后台配置不一致,错误码:10003 解决方案: 1,首先确定访问的第三方接口地址参数前后顺序是否正确,redirect_uri回调地址是否加了http ...