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$,所以可以先 ...
随机推荐
- Linux磁盘管理命令(fdisk,mount,umount,mkfs)
查看磁盘:fdisk -l 一块磁盘可以分14个分区 [root@wendyhost ~]# fdisk -l Disk /dev/sda: 64.4 GB, 64424509440 bytes 25 ...
- 用户登陆状态,ios开发用户登陆
IOS开发之记录用户登陆状态,ios开发用户登陆 上一篇博客中提到了用CoreData来进行数据的持久 化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreD ...
- ipv6被拒的解决方法
A,检测服务器是否支持ipv6连接 用mac 搭建IPv6环境测试,只能测试客户端到mac这段网络正常,但是mac到服务器还是IPv4的,所以没有办法测试服务器的IPv6是否正常.可以用手机打开2)步 ...
- ServiceModel 元数据实用工具 (Svcutil.exe)
ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档 一.SvcUtil.exe ServiceModel 元数据实用工具可在 Windows ...
- 『NiFi 学习之路』入门 —— 下载、安装与简单使用
一.概述 "光说不练假把式." 官网上的介绍多少让人迷迷糊糊的,各种高大上的词语仿佛让 NiFi 离我们越来越远. 实践是最好的老师.那就让我们试用一下 NiFi 吧! 二.安装 ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders
地址:http://codeforces.com/contest/765/problem/D 题目: D. Artsem and Saunders time limit per test 2 seco ...
- 发送邮件——stamplib
配置文email.ini件信息: [email]sender=xxxxxxxxxxxpwd=xxxxxxxxxxxxreciver=xxxxxxxxxxxxxpython 3.x代码如下: impor ...
- Java并发之Semaphore的使用
Java并发之Semaphore的使用 一.简介 今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽.现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类 ...
- xshell如何同时打开多个标签
查看标签>>>>>回话选项卡>>>>>> 打钩即可
- 使用Linq to XML 修改app.config
使用其他的方法修改app.config无效.而且修改的是*.vshost.exe.Config,程序运行时正常,关闭之后就还是原来的值. Configuration configuration = C ...