zay大爷的膜你题 D2T2——不老梦(AK梦)
这个题。。。。。是最难的。。。。但是不知道为啥扶苏神仙讲完了之后我竟然听懂了。。。。
所以这个题我要好好写一写
首先我们看一看每一个测试点,来一点点得分
第一个测试点n = 1,直接输出w1就行,5分到手
第2-5个点,数据范围很小,我们可以打深搜
因为n = 8,所以即使是全排列也无非是8!,小的可怜,然后o(n)地check一遍是不是合法,所以最后的时间复杂度是O(n!n)
要考虑排列顺序一定是保证某个点的所有儿子都出现之后才能出现,否则不合法,而对于合法的排列,我们计算其w值,并且min(ans,w的和),最后输出ans即可,然后就又拿到了20分
第6-7个点,我们可以发现那玩意是个二叉树,这个就好办多了,
我们考虑这样一个东西
现在我们扫到了一个根节点为a的点,他有两个儿子分别是x,y,如果先进入x,那么我们需要的石子数就是W[x](指的是其子树的和)+w[a],同理,先进去y的话,我们需要的石子数就是W[y](指的是其子树的和)+w[a],假设w[y]更大的话,我们先进入y,当我们把y的子树放满了,我们就可以放y这个点了,在把y放上之后,我们可以把y的所有子树的石子拿出来扔到x的子树里去,这样不仅能不多用石子,甚至还有可能多余出石子放在a里,要是你先进x的话,就会导致你还得多带上w[y] - w[x]个石子,否则你将放不满y的子树,这样就不合法了
因为是二叉树,所以直接判断就好啦,最后所有答案加起来就是结果啦
测试点8-10,因为最多只有5个孩子,又因为n不算太大,我们可以暴力算出选孩子的顺序看那个最优秀,时间复杂度是O(5! n),说实话5! = 120的话,最后也不过是1e6多一点,正常跑就行了
测试点 11-14: 树高最多为 3。考虑进入第 3 层时由于不能回收石子,所以进入第三层的顺序无所谓,即对于第 2 层的每个节点 u,都有。现在只需要考虑从 1 号节点 进入它的所有孩子节点的顺序即可。 考虑走完节点 u 的所有孩子 v 所需要的总石子数 c[u],显然是越少越好。证明如 下: 走完所有孩子后,所花费的总石子数不变,设剩下的石子(也就是所需要的减去所 花费的)为 ret,注意到当 c[u] 最小的时候即是 ret 最小的时候。考虑当 ret ≥ wu 的时候,直接用 ret 放下 u 上的石子,于是放石子在节点 u 的总花费就是 c[u],后者 越小越好。 当 ret < w[u] 的时候,用剩下的石子放在 u 上,然后再额外放上去一些石子,这 样做的花费是 ,这显然是最小的花费,考虑当 c[u] 越小 ret 才越小,c[u]取 最小时显然能取到最优情况。 综上,可以尽可能使 c[u]减小,来达到最优解。 那么问题变成了: 有 x 个商品,购买第 i 个物品需要手里有 ansi 元钱,花费 wi 元。求一个顺序 使得购买所有商品所需要的钱数最少。 这个问题的最最优顺序是按照不升序购买,也就是差值越大越要先买。 考虑证明: 设有两个物品 i,j,设 ai=ansi-wi,aj=ansj-wj。且 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 不升序购买最优。
最后贴一下代码吧
#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) {
scanf("%d", &x);
son[x].push_back(i);
}
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]) {
dfs(v);
}
std::sort(son[u].begin(), son[u].end(), cmp);
int _ret = ;
for (auto v : son[u]) {
if (_ret >= ans[v]) {
_ret -= ans[v];
} else {
ans[u] += ans[v] - _ret;
_ret = ans[v] - MU[v];
}
}
ans[u] += std::max(, MU[u] - _ret);
} inline bool cmp(const int &_a, const int &_b) {
return (ans[_a] - MU[_a]) > (ans[_b] - MU[_b]);
}
还有。。。。。。。c++11是个好东西可惜我不会。。。。。。。。
zay大爷的膜你题 D2T2——不老梦(AK梦)的更多相关文章
- zay大爷的膜你题 D2T1 江城唱晚
依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...
- NIOP 膜你题
NOIp膜你题 Day1 duliu 出题人:ZAY 1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...
- NOIP 膜你题 DAY2
NOIp膜你题 Day2 duliu 出题人:ZAY 题解 这就是一道组合数问题鸭!!! 可是泥为什么没有推出式子!! 首先我们知道的是 m 盆花都要摆上,然后他们的顺序不定(主人公忘记 ...
- zay大爷的神仙题目 D1T3-膜你抄
依旧是外链 锦鲤抄 [题目背景] 你在尘世中辗转了千百年 却只让我看你最后一眼 火光描摹容颜燃尽了时间 别留我一人,孑然一身 凋零在梦境里面. ——银临&云の泣<锦鲤抄> [问题描 ...
- zay大爷的神仙题目 D1T2-腐草为萤
题面如下 依照旧例放外链 [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼嫩的新叶, ...
- zay大爷的神仙题目 D1T1-大美江湖
在前几天的时候,千古神犇zay(吊打zhx那个)出了一套神仙题目,所以我得来分析分析QWQ 先补个网易云链接QWQ 毕竟是T1嘛,还算是比较简单的,那道题,读完题目就发现是个中等模拟(猪国杀算大模拟的 ...
- 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解
F. Monkeying Around 维护点在多少个线段上 http://codeforces.com/gym/101350/problem/F 题意:有m个笑话,每个笑话的区间是[L, R], ...
- NOIP2016 玩脱记
NOIP前: NOIP前停课了一个多月,这一个多月里浪得飞起,内心十分紧张,然后就不知不觉就到NOIP了. Day 0: 上火车前ryc给我们出了道题"一个数列,只有两个数出现了奇数次,找出 ...
- 2015 CTSC & APIO滚粗记
o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...
随机推荐
- C++ 大数运算(加减乘除取模)
加法:(字符串模拟小学加法) string add(string s1, string s2) { int len1 = s1.length(), len2 = s2.length(); ; '); ...
- 095、如何创建Swarm集群?(Swarm02)
参考https://www.cnblogs.com/CloudMan6/p/7862254.html 本节我们将创建三节点的swarm集群(操作系统Ubuntu 16.04 ,Docker 版本均 ...
- mysql数据库基础命令(一)
用户与权限 创建用户 mysql>create user test identified by 'BaC321@#'; 修改密码 ##5.5版本及以前的命令 mysql>set passw ...
- chrome插件2
转自:http://www.codeceo.com/article/15-chrome-extension.html 1. Web Developer 支持Chrome的Web Developer扩展 ...
- java 过滤器filter使用案例
主要需要 过滤器类 和配置文件 1.过滤器类 SessionFilter package com.service; import javax.servlet.*; import javax.serv ...
- 软件开发中oracle查询常用方法总结
上次新霸哥和大家讲解了一些关于oracle的知识发现大家对oracle还是比较感兴趣的,下面新霸哥就大家比较关系的oracle中常用的查询有哪几种?做个和oracle相关的开发的朋友可能会知道答案,但 ...
- AT&T推出云5G网络开源工具Airship
导读 AT&T新推出的云5G网络依赖于一个名为“Airship”的开源供应工具,该工具在周一发布了第一个版本. AT&T负责网络云的副总裁Amy Wheelus告诉LightReadi ...
- ieda与svn的配置与使用
一.idea配置svn 快捷键Ctrl+Alt+s或者File--Settings-- Subversion 设置svn客户端(小乌龟)的svn.exe可执行程序(如果找不到,请看另一篇文章) ...
- MINIUI grid学习笔记
grid 控件a.事件的绑定和移除 grid.on("rowclick", fn); //绑定事件 (这个的话类似jquery的绑定事件) grid ...
- python基础练习题4
题目:现有一个数据库记录文件(0005.txt)保证了学生课程签到的数据记录('2017-03-13 11:50:09',271,131),('2017-03-14 11:52:19',273,131 ...