题目描述

离线题库请

题目描述

某个公司有\(n\)个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。对于一个人, 如果他

下属(直接或者间接, 不包括他自己)中叛徒占的比例超过\(x\),那么这个人也会变成叛徒,并且他的所有下属都会变

成叛徒。你要求出一个最小的\(x\),使得最坏情况下,叛徒的个数不会超过\(k\)。

输入格式

第一行包含两个正整数\(n,k(1<=k<=n<=500000)\)。

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

输出格式

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

自己想出来的\(QWQ\),刚开始想的是二分\(+dp\),但是最后搞出来的方程发现和题解差不多

题解

思路细想的话非常绕!!!不细想的话随便搞搞也能出来

首先考虑这么两个事儿

  1. 最坏情况一定是子节点是第一个叛徒;

    因为假如某节点\(i\)变成叛徒,他的父亲\(fa\)不会受影响,那么他的叶节点\(leaf\)变成叛徒,反而可能把以\(i\)为根的子树全变成叛徒,创造更多的叛徒,甚至把\(fa\)也变成叛徒
  2. 最坏情况一定是一棵子树全部是叛徒,而不会出现森林;

我们考虑树上\(dp\)

首先统计出子树\(i\)的大小

那么让这颗子树变成叛徒的条件是什么呢,宁先想着,我待会儿和宁说

一个子树变成叛徒的边界条件是啥呢,就是求使当前子树变成叛徒的最大\(x\),\(x\)再大一点点就不行了,我们把这个稍微大一点点的\(x\)叫做\(x_1\),而我们求的是不让子树大小大于\(k\)的\(x\)的最小值,宁想一想这俩东西的关系

可以发现我们要求的答案就是所有大小大于\(k\)的子树的\(x_1\)的最大值,又因为是稍微大一点点,所以我们想成一样大

然后就可以\(dp\)了

此时回到上面的问题,让一颗子树变成叛徒的条件就是有一棵他的儿子叛变,而且以儿子为根的子树的大小在可以整棵子树所占的比例大于等于当前节点叛变要求的\(x\)

这俩条件需要同时满足,所以我们求其中的较小值,即以下

 minn = min( dp[son], 1.0 * siz[v] / ( siz[now] - 1 ) )     // 注意乘1.0,如果( double )转高精的话取完min就会变成0,我WA了一上午

然后我们在它的每棵子树的\(minn\)中取一个最大值就是当前节点恰好叛变的\(x\),也是恰好不叛变的值

最后在每个大小大于\(k\)的子树的\(dp\)里取个最大值,就是恰好不让所有的大于\(k\)的子树叛变的\(x\)即答案

#include<bits/stdc++.h>
using namespace std;
#define rint register int
int n, k;
int b[500010];
double dp[500010], ans;
vector< int > vec[500010];
inline int read( void ){
int re = 0, f = 1; char ch = getchar();
while( ch > '9' || ch < '0' ){
if( ch == '-' ) f = -1;
ch = getchar();
}
while( ch >= '0' && ch <= '9' ){
re = re * 10 + ch - '0';
ch = getchar();
}
return re * f;
}
inline void dfs( int now ){
b[now] = 1;
for( rint i = 0; i < vec[now].size(); i++ ){
int v = vec[now][i];
dfs( v );
b[now] += b[v];
}
dp[now] = ( b[now] == 1 );
if( b[now] != 1 ){
for( rint i = 0; i < vec[now].size(); i++ ){
int v = vec[now][i];
dp[now] = fmax( dp[now], fmin( dp[v], 1.0 * b[v] / ( b[now] - 1 ) ) );
}
}
if( b[now] > k ){
ans = max( ans, dp[now] );
}
}
int main( void ){
n = read(); k = read();
for( rint i = 2; i <= n; i++ ){
int u; u = read();
vec[u].push_back( i );
}
dfs( 1 );
cout << ans;
return 0;
}

数据点下载

[POI2017]bzoj4726 Sadota?的更多相关文章

  1. 【POI2017||bzoj4726】Sabota?

    上学期putsnan过了一次,这学期认真写了一遍…… #include<bits/stdc++.h> #define N 500010 using namespace std; ]; ,n ...

  2. 【POI2017||bzoj4726】Flappy Birds

    外国人很良心的啊,这题比NOIP那题还简单…… 不用管他最后的位置,因为移动的次数肯定是恒定的,所以维护在每一个柱子的位置能飞到的范围,递推下去即可. #include<bits/stdc++. ...

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

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

  4. bzoj4726【POI2017】Sabota?

    首先可以推出来如果i没有带头叛变,那么i的父亲也一定不会带头叛变,证明显然 所以最劣情况初始的叛徒肯定是叶子,并且带头叛变的人一定是从某个叶子往上走一条链 f[i]表示i不带头叛变的话最小的x 那么我 ...

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

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

  6. BZOJ4726: [POI2017]Sabota?

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

  7. [bzoj4726][POI2017][Sabota?] (树形dp)

    Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人 ...

  8. BZOJ 4726: [POI2017]Sabota?

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

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

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

随机推荐

  1. [LC] 142. Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...

  2. c socket 开发测试

    c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...

  3. HHP|HPLC-MS/MS|PMT|PST|de novo|

    生物医学大数据 Protein 应用 人类蛋白质组计划 Gene的存在要依靠在蛋白水平确认基因真实存在. 蛋白质组是确定时间地点的研究单元的蛋白质总体,因为时间.地点和研究单元的相互组合存在多种变化, ...

  4. Caused by: com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 0, fastjson-version 1.2

    环境: vue.js 问题: 当添加评论时 重新查询数据刷新数据控制台异常Caused by: com.alibaba.fastjson.JSONException: syntax error, ex ...

  5. 吴裕雄--天生自然 R语言开发学习:回归(续三)

    #------------------------------------------------------------# # R in Action (2nd ed): Chapter 8 # # ...

  6. Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)

    一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...

  7. OCR:慧眼读世界

    作者:微软亚洲研究院首席研究员 霍强 把手机摄像头对准菜单上的法语菜名,屏幕上实时显示出翻译好的中文菜名:将全世界图书馆的藏书转化为电子书:街景车游走于大街小巷,拍摄街景的同时也从街景图像中自动提取文 ...

  8. TCP\IP协议簇-分层模型

    OSI 模型   数据单元 层 功能 主机层 Data(数据) 7. 应用层 网络进程到应用程序. 6. 表示层 数据表示形式,加密和解密,把机器相关的数据转换成独立于机器的数据. 5. 会话层 主机 ...

  9. toString()和强制类型转换(String)的用法

    原来是String类型的才可以强转到String,不然会报 ClassCastException异常: 所有的引用类型都从Object类继承了toString方法.

  10. nginx 代理第三方邮件站点

    需求:公司业务服务器使用的是阿里云,要求内网(仅有内网IP)所有流量走网关服务器(有外网IP及内网IP),内网服务器需要调用一个公网上的第三方邮件站点.在参考了https://www.linuxba. ...