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. POJ - 3244-Difference between Triplets

    其实我最开始没有这道题...是做到UPC-11079-小P的决斗,训练结束后然后搜索了一波,才了解这个题的. 非常牛逼的题...这么多人做出来了...我好菜... 对于每对三元组Ta=(La,Ja,K ...

  2. UnderWater+SDN论文之六

    Protocol Emulation Platform Based on Microservice Architecture for Underwater Acoustic Networks Sour ...

  3. Acceleration for ML 论文导读

    Energy efficient parallel neuromorphic architectures with approximate arithmetic on FPGA Motivation ...

  4. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

     varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...

  5. 软件工程(FZU2015) 助教总结

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 本次构建之法-SE助教工作,和福州大学张老师协作,福大学生基本发挥出了一定水平,在此做个小结. 教师 张老师本身的SE教学 ...

  6. python Drools

    python Drools - 国际版 Binghttps://cn.bing.com/search?q=python+Drools&qs=n&FORM=BESBTB&sp=- ...

  7. Arrays.copyOf() 和 System.arrayCopy()分析

    java数组的拷贝四种方法:for.clone.System.arraycopy.Arrays.copyof public class Test1 { public static void main( ...

  8. Docker实现运行tomcat并部署项目war包,并实现挂载目录

    之前写的有点乱,现在再来整理一下docker的简单部署运行 借鉴博客:https://blog.csdn.net/qq_32351227/article/details/78673591 一.dock ...

  9. Jenkins系统上的时间不正确问题

    很简单,点击系统管理,选择执行脚本命令: 打开 [系统管理]->[脚本命令行]运行下面的命令 System.setProperty('org.apache.commons.jelly.tags. ...

  10. python之路--网络通信协议

    一 . osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 二 . tcp三次握手和四次挥手 我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真 ...