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的更多相关文章

  1. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  2. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  3. 【13.91%】【codeforces 593D】Happy Tree Party

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. 【codeforces 723F】st-Spanning Tree

    [题目链接]:http://codeforces.com/contest/723/problem/F [题意] 给你一张图; 让你选择n-1条边; 使得这张图成为一颗树(生成树); 同时s的度数不超过 ...

  5. 【codeforces 348B】Apple Tree

    [题目链接]:http://codeforces.com/problemset/problem/348/B [题意] 给你一棵树; 叶子节点有权值; 对于非叶子节点: 它的权值是以这个节点为根的子树上 ...

  6. 【 Gym - 101138J 】Valentina and the Gift Tree(树链剖分)

    BUPT2017 wintertraining(15) 4 D Gym - 101138J 数据 题意 n个节点的一棵树,每个节点的权值为g,q个询问,树上的节点U-V,求U到V的路径的最大子段和. ...

  7. 【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 ...

  8. 【HDU2815】【拓展BSGS】Mod Tree

    Problem Description   The picture indicates a tree, every node has 2 children.  The depth of the nod ...

  9. 【Codeforces715C&716E】Digit Tree 数学 + 点分治

    C. Digit Tree time limit per test:3 seconds memory limit per test:256 megabytes input:standard input ...

随机推荐

  1. spring security运行流程图(转)

    原文:http://blog.csdn.net/u011511684/article/details/31394493 示例下载地址:http://download.csdn.net/detail/u ...

  2. PS调出清新淡雅外景女生背影照

    首先,依然是前期事项. 这套图是八月份下午三点多在草地上拍的(好像标题的秋日欺骗了大众XD),阳光很烈,不过也因为这样,能拍出比较清新的蓝天.用的是腾龙70-200 2.8VC拍摄,长焦在拍这种空旷大 ...

  3. Oracle和Elasticsearch数据同步

    Python编写Oracle和Elasticsearch数据同步脚本 标签: elasticsearchoraclecx_Oraclepython数据同步    Python知识库 一.版本 Pyth ...

  4. debian下 Hadoop 1.0.4 集群配置及运行WordCount

    说明:我用的是压缩包安装,不是安装包 官网安装说明:http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html,繁冗,看的眼花...大部分人应该都不 ...

  5. 2019省赛训练组队赛3.26周二---FJUT 2016

    A.Minimum’s Revenge There is a graph of n vertices which are indexed from 1 to n. For any pair of di ...

  6. React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)

    React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例) TextInput组件介绍 TextInput是一个允许用户在应用中通过键盘输入文本的基本组 ...

  7. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  8. Python时间的简单使用

    1.time.strptime(string[, format]),string -- 时间字符串.format -- 格式化字符串.返回struct_time对象.     把字符串转换为时间格式, ...

  9. Unable to handle kernel paging request at virtual address

    1.Unable to handle kernel paging request at virtual address 00000000 =====>越出内核地址空间范围,原因是由于使用空NUL ...

  10. 关于IWMS后台登录问题总结

    一.登录后台,点击登录无反应: 1.是因为网站文件夹没有权限,需要右击文件夹,将只读勾选去掉 2.在安全中加入Everyone对象. 二.登录后台后,左边显示不全,是因为会员权限不够,需要给权限.