题目描述

离线题库请

题目描述

某个公司有\(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. ServletContextListener 监听器

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...

  2. orcale 11g安装,创建表空间,用户,授权用户

    一.卸载旧oracle 用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设 ...

  3. Android开发之《USB Camera》

    SimpleWebCam Source Code:https://bitbucket.org/neuralassembly/simplewebcam/src 1. USB摄像头UVC兼容(如今大部分兼 ...

  4. 一分钟搞定pychram远程调试和同步代码

    首先说一下需求,否则很多人都不知道pycharm这个远程同步和调试到底是干嘛使的. 需求很简单,我想要在本地的windows机器上跑一个程序,但是程序运行会加载一些很占内存的树型数据结构,称其为tre ...

  5. 吴裕雄--天生自然KITTEN编程:青蛙答题过河

  6. vue watch和computed的使用场景

    watch 监听某个数据的变化(监听完调用什么函数) 一个数据影响多个数据 (比如:浏览器自适应.监控路由对象.监控自身属性变化) computed 计算后返回新 一个数据受多个数据影响(比如:计算总 ...

  7. TICA 2019 自动的自动化测试——智能化一站式的API测试服务

    阿里QA导读:新奥集团中台的陈磊为我们打开了AI测试驱动的视野,同时也深入浅出地介绍了如何打造智能化API测试框架.通过陈磊老师的分享,我们看到了AI-DT的无限可能性.以后,AI能不能代替大部分手动 ...

  8. 初识JS之数据类型

    JavaScript JavaScript引入方式 Script标签内写代码 <script> // 在这里写你的JS代码 </script> 引入额外的JS文件 <sc ...

  9. Android App 测试工具及知识大集合

    简介: 作者从事测试将近11年,有8年的团队管理经验,经历了上市公司,外包,日企,股份制公司的企业文化洗礼,擅长测试团队的组建,流程建立,改造,质量体系建建设,有三次经历在不同企业文化从"0 ...

  10. 安装NSQ

    安装文档 https://nsq.io/deployment/installing.html 打开连接后,根据系统找到对应的二进制包 一般都是linux则下载 https://s3.amazonaws ...