Description

某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。对于一个人, 如果他
下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变
成叛徒。你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k。

Input

第一行包含两个正整数n,k(1<=k<=n<=500000)。
接下来n-1行,第i行包含一个正整数p[i+1],表示i+1的父亲是p[i+1](1<=p[i+1]<=i)。

Output

输出一行一个实数x,误差在10^-6以内都被认为是正确的。

Sample Input


Sample Output

0.6666666667

HINT

答案中的x实际上是一个无限趋近于2/3但是小于2/3的数
因为当x取2/3时,最坏情况下3,7,8,9都是叛徒,超过了k=3。

Source

鸣谢Claris上传

Solution

树形dp嘛。

来自popoqqq的题解:

1.我们可以证明,最坏情况下,叛徒一定是叶子节点。

即,若有一个非叶节点是叛徒,且其儿子不是叛徒,而它父亲又被策反了,那么它的儿子是叛徒从而策反父亲的机率||比例显然更优

2.我们可以得出,一人策反,全家策反,也就是一些叛徒一定在整颗子树里

对于一个点x,设f[x]为x点不被策反需要的最小的比例

那么初始态,即叶子节点f[叶]=1

对于每个非叶节点,枚举儿子,在儿子中取最大的,儿子都是叛徒的比例或儿子不是叛徒的最小值来满足此点不是叛徒

对于每个大小大于k的子树,记录答案,去最大值

代码比较简单,用记事本手写直接交就ac了

#include <stdio.h>
#include <string.h>
#define MaxN 500010
#define MaxBuf 1<<22
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
#define dmax(a,b) ((a)>(b)?(a):(b))
#define dmin(a,b) ((a)<(b)?(a):(b))
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(RG Type &x){
x=;RG int c=Blue();
for(;c<||c>;c=Blue())
;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
}
bool isn_leave[MaxN];
int n,sz[MaxN],m;
double f[MaxN],ans;
struct Pointer{
int to;
Pointer *next;
}*fir[MaxN],mem[MaxN],*tot=mem;
inline void link(RG int x,RG int y){
isn_leave[x]=true;
*++tot=(Pointer){y,fir[x]},fir[x]=tot;
}
void _dfs(RG int at){
sz[at]=;
for(Pointer *iter=fir[at];iter;iter=iter->next)
_dfs(iter->to),sz[at]+=sz[iter->to];
}
void tree_dp(RG int at){
if(!isn_leave[at]) {f[at]=1.000; return;}
for(Pointer *iter=fir[at];iter;iter=iter->next){
tree_dp(iter->to);
f[at]=dmax(f[at],dmin(f[iter->to],(double)sz[iter->to]/(sz[at]-)));
}
if(sz[at]>m)
ans=dmax(ans,f[at]);
}
int main(){
Rin(n),Rin(m);
for(RG int i=;i<=n;i++){
RG int pa;
Rin(pa);
link(pa,i);
}
_dfs(); tree_dp();
printf("%.10lf\n",ans);
return ;
}

[bzoj4726][POI2017][Sabota?] (树形dp)的更多相关文章

  1. 【BZOJ4726】[POI2017]Sabota? 树形DP

    [BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者 ...

  2. BZOJ 4726: [POI2017]Sabota? 树形dp

    4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...

  3. BZOJ 4726 POI 2017 Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 【树形dp】bzoj4726: [POI2017]Sabota?

    找点概率期望的题做一做 Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占 ...

  5. BZOJ4726: [POI2017]Sabota?

    $n \leq 500000$的树,开始有一个点是坏的,如果一个子树中坏点比例(不包括根节点)超过x那这整棵子树就会变坏,问最坏情况下不超过$K$个坏点的情况下$x$最小是多少. 被坑成傻逼.. 可以 ...

  6. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  7. BZOJ_4726_[POI2017]Sabota?_树形DP

    BZOJ_4726_[POI2017]Sabota?_树形DP Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属 ...

  8. [POI2017]Sabota【观察+树形Dp】

    Online Judge:Bzoj4726 Label:观察,树形Dp,水题 题目描述 某个公司有n个人, 上下级关系构成了一个有根树.公司中出了个叛徒(这个人不知道是谁). 对于一个人, 如果他下属 ...

  9. BZOJ 4726: [POI2017]Sabota?

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 301  Solved ...

随机推荐

  1. openstack dnsmasq彭祖

    Openstack dnsmasq配置域名解析,openstackdnsmasq vi /etc/nova/nova.conf 在[DEFAULT]添加 dnsmasq_config_file=/et ...

  2. 错误: 实例 "ruiy" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)].

    错误: 实例 "ruiy" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: 'ascii' codec can't decode byte 0xe6 in posi ...

  3. bzoj 1725: [Usaco2006 Nov]Corn Fields牧场的安排【状压dp】

    压一维状态,转移时把符合条件的上一行加上 #include<iostream> #include<cstdio> using namespace std; const int ...

  4. 清北考前刷题da7下午好

    三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...

  5. self , static 都是何方神圣?

    前言: php中 this  用于代指 对象, 而代指类的却有3个:self , static , parent self , static , parrent 既然都能代指类,那么他们之间又有哪些区 ...

  6. gitlab&Jenkins 详细介绍及其应用

    第1章 gitlab 1.1 系统环境 [root@jenkins ~]# cat  /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...

  7. mysqldump使用笔记

    mysqldump备份简述 mysqldump可产生两种类型的输出文件,取决于是否选用 --tab=dir_name选项. 1.不使用 --tab=dir_name选项,mysqldump产生的数据文 ...

  8. 安装ipython notebook及基本命令(快捷键)

    转载自:http://121.42.47.99/yuenshome/wordpress/?p=2622 目前基本上是Pycharm和ipython notebook结合起来做东西,ipython no ...

  9. Mysql导入导出大量数据的方法、备份恢复办法

    经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyad ...

  10. Jmeter在windows上安装和环境配置

    一.Jmeter简单介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具.它可以用于测试静态和动态资源,例如静态文件.Java小服务程序.CGI 脚本.Java 对象.数 ...