[POI2017]Sabota【观察+树形Dp】
Online Judge:Bzoj4726
Label:观察,树形Dp,水题
题目描述
某个公司有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}\)以内都被认为是正确的。
样例
Input
9 3
1
1
2
2
2
3
7
3
Output
0.6666666667
Hint
当x取2/3时,最坏情况下3,7,8,9都是叛徒,超过了k=3。
答案中的x实际上是一个无限趋近于2/3但是大于2/3的数。
题解
看样例知道实际上是求一个转变的临界值。
观察一下发现,要叛变就是整个子树一起叛变,而且因为只选了一个叶子节点做叛徒,所以只会有这唯一一棵树叛变——不会出现多棵不相关的子树同时叛变。
那么我们只需要算出以每个点为根的子树叛变时所需的最大叛变比例\(lim[i]\)即可。上面这个定义有点繁琐,本质是比例\(lim\)调大,子树叛变越难。我们就是求一个最大值,使得在这个比例下,子树刚好叛变,如果提高一点就叛变不了了。
求\(lim\)的方法类似树形dp。
最后统计时的代码如下,其中\(siz\)表示子树大小。求其中的最大值,因为比例达到这个最大值时,这些\(siz>k\)的子树都叛变不了(如果叛变了就不合法了)。
double ans=0;
for(int i=1;i<=n;i++)if(siz[i]>k)ans=max(ans,lim[i]);
printf("%.7f",ans);
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
vector<int>e[N];
int n,k,siz[N];
double lim[N];//i的子树中叛变,能让i也叛变的最大k值
void dfs(int x){
siz[x]=1;
for(int i=0;i<e[x].size();i++)dfs(e[x][i]),siz[x]+=siz[e[x][i]];
if(siz[x]==1)lim[x]=1.0;
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
lim[x]=max(lim[x],min(lim[y],1.0*siz[y]/(siz[x]-1.0)));
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=2,u;i<=n;i++){
scanf("%d",&u);
e[u].push_back(i);
}
dfs(1);
double ans=0;
for(int i=1;i<=n;i++)if(siz[i]>k)ans=max(ans,lim[i]);
printf("%.7f",ans);
}
[POI2017]Sabota【观察+树形Dp】的更多相关文章
- BZOJ_4726_[POI2017]Sabota?_树形DP
BZOJ_4726_[POI2017]Sabota?_树形DP Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属 ...
- BZOJ 4726 [POI2017]Sabota?:树形dp
传送门 题意 某个公司有 $ n $ 个人,上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过 $ x $ , ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- BZOJ 4726: [POI2017]Sabota? 树形dp
4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...
- 【BZOJ4726】[POI2017]Sabota? 树形DP
[BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者 ...
- [bzoj4726][POI2017][Sabota?] (树形dp)
Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人 ...
- BZOJ 4726 POI 2017 Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形dp专题总结
树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...
- BZOJ 4726: [POI2017]Sabota?
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 301 Solved ...
随机推荐
- 传统的dom的渲染方式
DOM渲染的过程大致分为三个阶段: 后端渲染 前端渲染 独立DOM渲染(前后端相结合渲染) 1.后端渲染:DOM树的生成完全是在后端服务器中完成的,后端服务器的程序会把需要的数据拼合成一个类似于前端D ...
- laravel 优化小记
laravel 优化 7 Performance Optimization Tips for the Laravel Developer 运行 php artisan optimize php art ...
- CSS——背景渐变
在线性渐变过程中,颜色沿着一条直线过渡:从左侧到右侧.从右侧到左侧.从顶部到底部.从底部到顶部或着沿任何任意轴.如果你曾使用过制作图件,比如说Photoshop,你对线性渐变并不会陌生. 兼容性问题很 ...
- layui弹框文件导入
lr.ajax({ type : "post", data :formFile, url : importUrl, contentType: false,// 且已经声明了属性en ...
- CF919D Substring (dag dp)
传送门 解题思路 感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次..),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可. 代码 #inc ...
- python模块typing的作用
一.介绍 Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数, ...
- VC6 Release下,生成pdb文件
1.Generate debug必须选上,否则没有调试信息 2.把优化disable,否则容易产生代码地址偏移: 3.用program database产生PDB文件: 4.将dll, exe, pd ...
- JAVA 设计模式之 原型模式详解
原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式利用的是克隆的原理,创建新的对象,JDK提供的Cloneable 和JSON. ...
- 使用docker安装redis
1.安装docker .检查内核版本,必须是3.10及以上 [root@localhost ~]# uname -r .安装docker [root@localhost ~]# yum install ...
- spark2.0在IDE运行的问题
spark2.0搭建到服务器跑很方便,但是本地跑和之前1.6还是有点区别,鼓捣了一点到半夜2点多总算能跑了.. 遇到的问题 1.idea千万要用file---setting-----plugins的s ...