BZOJ 4726 [POI2017]Sabota?:树形dp
题意
某个公司有 $ n $ 个人,上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过 $ x $ ,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒。你要求出一个最小的 $ x $ ,使得最坏情况下,叛徒的个数不会超过 $ k $ 。$ (1 \leq k \leq n \leq 500000) $
题解
首先有一个显然的二分做法,然而不知道为什么会被卡……
于是考虑能不能 $ O(n) $ 做。
首先有两个结论:
- 最坏情况下,最初的那一个叛徒一定是叶子结点。
- 如果一个非叶子节点叛变,则它其中的一个儿子一定叛变
所以最终所有的叛徒一定是原树中的一棵子树。
$ f[i] $ 表示要使节点 $ i $(及其下属)恰好不能叛变的最小比例 $ x $
因为所有 $ size[i] > k $ 的子树都不能叛变
所以 $ ans = max(f[i]) \quad (size[i] > k) $
然后考虑怎样求 $ f[i] $
$ f[i] $ 也等价于恰好让 $ i $ 叛变的最大比例 $ x $
对于每一个 $ i $ ,首先枚举它的哪个子树叛变了(假设是 $ j $ )
那么想让 $ i $ 叛变有两个条件:
- 比例 $ x $ 满足能够让 $ j $ 叛变
- 比例 $ x $ 满足 $ \dfrac{size[j]}{size[i] - 1} > x $
所以 $ f[i] = max(f[i], min(f[j], \dfrac{size[j]}{size[i]-1})) $
边界条件为:$ f[i] = \begin{cases} 1 \quad \text{叶子结点} \\ 0 \quad \text{非叶子节点} \end{cases} $
AC Code
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 500005
using namespace std;
int n,k;
int siz[MAX_N];
double ans=0;
double f[MAX_N];
vector<int> edge[MAX_N];
void read()
{
scanf("%d%d",&n,&k);
int x;
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
edge[x].push_back(i);
}
}
void dfs(int x)
{
siz[x]=1,f[x]=(edge[x].size()==0);
for(int i=0;i<edge[x].size();i++)
{
int t=edge[x][i];
dfs(t),siz[x]+=siz[t];
}
for(int i=0;i<edge[x].size();i++)
{
int t=edge[x][i];
f[x]=max(f[x],min(f[t],siz[t]/(siz[x]-1.0)));
}
if(siz[x]>k) ans=max(ans,f[x]);
}
void work()
{
dfs(1);
printf("%.9f\n",ans);
}
int main()
{
read();
work();
}
BZOJ 4726 [POI2017]Sabota?:树形dp的更多相关文章
- BZOJ 4726: [POI2017]Sabota? 树形dp
4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...
- BZOJ 4726: [POI2017]Sabota?
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 301 Solved ...
- 【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 ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...
- BZOJ 4890: [Tjoi2017]城市 树形dp
标签:树形dp,枚举,树的直径 一上来看到这个题就慌了,只想到了 $O(n^3)$ 的做法. 碰到这种题时要一步一步冷静地去分析,观察数据范围. 首先,$n\leqslant 5000$,所以可以先 ...
随机推荐
- Oracle-Rman(物理备份)
Rman(物理备份) Rman -recover manager Rman 备份的对象 数据文件 数据文件 (Data File) 控制文件 控制文件 (Control File) 参数文件 参数文件 ...
- What is Grammar?
What is Grammar? And why grammar is your friend… Grammar(noun): the structure and system of a langua ...
- Java 其他对象的 API
System 类 (java.lang 包下) 该类中的方法和属性都是静态的. 常见方法 // 1, 获取当前时间的毫秒值 long currentTimeMillis(); // 2, 获取系统的属 ...
- Type Java compiler level does not match the version of the installed Java project facet.项目内容没错但是项目上报错,不影响运行
1.Window->Show View->Problems 2.在项目上右键properties->project Facets->修改右侧的version 保持一致 3.w ...
- 从es中拉取全部数据/大量数据 使用scroll+scan避免深分页
es一次请求默认返回的数据条数是10条,可以通过设置size参数来控制返回数据的条数: 如果要返回很多数据,可以把size设置的很大,不过elastic search默认size最大不能超过1万. 那 ...
- Django - 权限(1)
一.权限表结构设计 1.认识权限 生活中处处有权限,比如,腾讯视频开会员才有观看某个最新电影的权限,你有房间钥匙就有了进入这个房间的权限,等等.同样,程序开发过程中也有权限,我们今天说的权限指的是we ...
- 003-mysql查询表的数据大小
在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.查看数据库表结构大小,要查询表所占的容量,就是把表的数 ...
- Go 结构体和map等数据结构转json字符串
Go语言中使用json包中的 Marshal() 函数将数据结构转成json字符串,源代码: func Marshal(v interface{}) ([]byte, error) { e := ne ...
- GSM/GPRS/3G/4G
1.状态机机制的gprs拨号 像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描 ...
- 判断元素的16中方法expected_conditions
from selenium.webdriver.support import expected_conditons as EC 1.title_is:判断当前页面的title是否完全等于预期字符串,返 ...