【Gym - 100796C 】Minimax Tree
BUPT2017 wintertraining(15) #7FMinimax Tree
题意
给你一棵多叉树,非叶子节点中分配k个为子节点的min函数,剩下的是max函数。
现在求根节点(1)的最大值和最小值。
题解
因为最大值和最小值求法对称,以求最小值为例。
要让尽量小的上来,可以贪心选择一条路前面都是min不够了后面就用max。
因为如果min上面有max,max换到下面不会更差。
但是这条前面都是min的路选哪一条呢?显然是最后一个min节点的子节点里max取最小的。
共k个min,所以取第k+1层所有节点的max函数的最小值。
但是,如果有的叶子深度小于k,是可以直接达到的,所以要取这些叶子的最小值更新答案。
但是,如果一个节点只有一个子节点,原来认为一条路前面都选min的贪心就不成立了,如
得到5 得到2
min min
+ +
| |
+----+----+ +----+----+
| | | |
v v min v v max
5 | 5 |
v max v max
| |
v max v max
| |
v max v min
| |
+--+---+ +--+---+
v v v v
2 7 2 7
把每个单子节点深度设为父节点的深度,这样就可以计算出正确答案。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100005;
const int inf = 1e9+1;
struct edge{
int to,next;
}e[N<<1];
int cnt,head[N];
void add(int fa,int son){
e[++cnt]=(edge){son, head[fa]};
head[fa]=cnt;
}
int ma[N], mi[N], dma[N], dmi[N];
int n,k;
int dep[N];
int son[N];
void dfs(int x, int fa){
dep[x]=dep[fa]+(son[fa]!=1);
for(int i=head[x]; i; i=e[i].next){
dfs(e[i].to, x);
mi[x]=min(mi[x], mi[e[i].to]);
ma[x]=max(ma[x], ma[e[i].to]);
}
dmi[dep[x]]=min(dmi[dep[x]],ma[x]);
dma[dep[x]]=max(dma[dep[x]],mi[x]);
}
bool noleaf[N];
int main(){
scanf("%d%d",&n,&k);
for(int i=2;i<=n;++i){
int p;
scanf("%d",&p);
noleaf[p]=true;
++son[p];
add(p,i);
}
for(int i=1;i<=n;++i)dmi[i]=inf;
int leaf=0;
for(int i=1;i<=n;++i){
int a;
scanf("%d",&a);
if(!noleaf[i]){
mi[i]=ma[i]=a;
++leaf;
}else{
mi[i]=inf;
}
}
dfs(1,0);
int ans1=dmi[k+1], ans2=dma[n-leaf-k+1];
for(int i=1;i<=n;++i)if(!noleaf[i]){
if(dep[i]<k+1)ans1=min(ans1, mi[i]);
if(dep[i]<n-leaf-k+1)ans2=max(ans2, mi[i]);
}
printf("%d %d", ans1, ans2);
return 0;
}
【Gym - 100796C 】Minimax Tree的更多相关文章
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
- 【POJ 2486】 Apple Tree(树型dp)
[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8981 Acce ...
- 【13.91%】【codeforces 593D】Happy Tree Party
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 723F】st-Spanning Tree
[题目链接]:http://codeforces.com/contest/723/problem/F [题意] 给你一张图; 让你选择n-1条边; 使得这张图成为一颗树(生成树); 同时s的度数不超过 ...
- 【codeforces 348B】Apple Tree
[题目链接]:http://codeforces.com/problemset/problem/348/B [题意] 给你一棵树; 叶子节点有权值; 对于非叶子节点: 它的权值是以这个节点为根的子树上 ...
- 【 Gym - 101138J 】Valentina and the Gift Tree(树链剖分)
BUPT2017 wintertraining(15) 4 D Gym - 101138J 数据 题意 n个节点的一棵树,每个节点的权值为g,q个询问,树上的节点U-V,求U到V的路径的最大子段和. ...
- 【POJ 2486】 Apple Tree (树形DP)
Apple Tree Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to a ...
- 【HDU2815】【拓展BSGS】Mod Tree
Problem Description The picture indicates a tree, every node has 2 children. The depth of the nod ...
- 【Codeforces715C&716E】Digit Tree 数学 + 点分治
C. Digit Tree time limit per test:3 seconds memory limit per test:256 megabytes input:standard input ...
随机推荐
- hdu6249 区间动态规划
题目链接 题意:给出一些区间,求选k个区间能覆盖的最多点的数量 思路:定义dp[i][j]为前i个点取j个区间的最大值.dp[i][j]可以转移到dp[i+1][j+1]和以i+1为起点的区间终点 具 ...
- Lombok 安装、入门以及使用
lombok 的官方网址:http://projectlombok.org/ lombok 安装 使用 lombok 是需要安装的,如果不安装,IDE 则无法解析 lombok 注解.先在官网下 ...
- MySQL经典编程问题
星期数的问题 1 计算日期是周几 这个问题看似很简单,可以用MySQL内置函数来计算 (1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday: (2) dayof ...
- angularjs4+ionic3集成搭建
1:安装一下cnpm用淘宝镜像安装npm install -g cnpm --registry=https://registry.npm.taobao.org 2:使用 cnpm命令安装(全局安装 A ...
- [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比
迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比 Intel 最强CPU 从最开始的双核 到现在的 28核 发展迅猛. https://www.cnbeta.com/article ...
- spring的xml配置里,最好不要配置xsd的版本名称
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- npm install、npm install --save与npm install --save-dev区别
npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- onbeforeunload事件两种写法及效果
在符合W3C标准的浏览器里,可以使用addEventListener方法来添加事件. 当不需要为一个事件添加多个处理函数的时候,可以简单的使用onXXX=function(){}的方式来添加事件处理函 ...
- Vue插件plugins的基本操作
前面的话 本文将详细介绍Vue插件plugins的基本操作 开发插件 插件通常会为 Vue 添加全局功能.插件的范围没有限制——一般有下面几种: 1.添加全局方法或者属性,如: vue-custom- ...