还是万年不变的外链

这个题。。。。。是最难的。。。。但是不知道为啥扶苏神仙讲完了之后我竟然听懂了。。。。

所以这个题我要好好写一写

首先我们看一看每一个测试点,来一点点得分

第一个测试点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梦)的更多相关文章

  1. zay大爷的膜你题 D2T1 江城唱晚

    依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...

  2. NIOP 膜你题

    NOIp膜你题   Day1 duliu 出题人:ZAY    1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...

  3. NOIP 膜你题 DAY2

    NOIp膜你题   Day2 duliu 出题人:ZAY     题解 这就是一道组合数问题鸭!!!  可是泥为什么没有推出式子!! 首先我们知道的是 m 盆花都要摆上,然后他们的顺序不定(主人公忘记 ...

  4. zay大爷的神仙题目 D1T3-膜你抄

    依旧是外链 锦鲤抄 [题目背景] 你在尘世中辗转了千百年 却只让我看你最后一眼 火光描摹容颜燃尽了时间 别留我一人,孑然一身 凋零在梦境里面. ——银临&云の泣<锦鲤抄> [问题描 ...

  5. zay大爷的神仙题目 D1T2-腐草为萤

    题面如下 依照旧例放外链 [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼嫩的新叶, ...

  6. zay大爷的神仙题目 D1T1-大美江湖

    在前几天的时候,千古神犇zay(吊打zhx那个)出了一套神仙题目,所以我得来分析分析QWQ 先补个网易云链接QWQ 毕竟是T1嘛,还算是比较简单的,那道题,读完题目就发现是个中等模拟(猪国杀算大模拟的 ...

  7. 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解

    F. Monkeying Around   维护点在多少个线段上 http://codeforces.com/gym/101350/problem/F 题意:有m个笑话,每个笑话的区间是[L, R], ...

  8. NOIP2016 玩脱记

    NOIP前: NOIP前停课了一个多月,这一个多月里浪得飞起,内心十分紧张,然后就不知不觉就到NOIP了. Day 0: 上火车前ryc给我们出了道题"一个数列,只有两个数出现了奇数次,找出 ...

  9. 2015 CTSC & APIO滚粗记

    o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...

随机推荐

  1. 12.AutoMapper 之Null替换(NullSubstitution)

    https://www.jianshu.com/p/3f86f237d1db Null 替换(Null Substitution) Null 替换允许当源类型成员在成员链任何位置为Null时给目标成员 ...

  2. scala学习笔记(1)

    scala ------------------------- java语言脚本化 1.安装scala-2.12.1.msi 2.进入到scala的命令行 3.Tab键会有补全的功能 1.scala程 ...

  3. xml的解析及案例的分析和分享

    HTML的文档如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=& ...

  4. python 解决cv2绘制中文乱码

    因为使用cv2.putText() 只能显示英文字符,中文会出现乱码问题, 因此使用PIL在图片上绘制添加中文,可以指定字体文件. 大体思路: OpenCV图片格式转换成PIL的图片格式: 使用PIL ...

  5. 安装与学习laravel

    安装 composer cd /var/www/html curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/ ...

  6. QWidget 设置背景图片

    QWidget 设置背景图片办法: 利用 QPaltette QPixmap pixmap("back.png"); QPalette palette; palette.setBr ...

  7. 【转载】网易极客战记官方攻略-地牢-Kithgard 橱柜 A

    关卡连接: https://codecombat.163.com/play/level/cupboards-of-kithgard-a 谁知道什么样的恐怖事情潜伏在 Kithgard 的橱柜里? 简介 ...

  8. 基于gtid复制主要操作记录

    基于gtid复制主要操作记录 一.安装系统依赖包 在主从上都要安装该依赖包. yum -y install perl-DBI yum -y install perl-DBD-MySQL yum -y ...

  9. 34 String、StringBuffer、StringBuilder

    String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. StringBuffer是可变类,和线程安全的字符串操作类,任何对 ...

  10. JAVA笔记15-线程同步

    一.概念 1.多个线程之间访问同一资源,进行协调的过程是线程同步.例如两个人同时操作同一银行账户.解决方法:加锁 2.Java种引入对象互斥锁的概念,保证共享数据操作的完整性.每个对象都对应于一个可称 ...