BZOJ 4726 POI 2017 Sabota? 树形DP
4726: [POI2017]Sabota?
Time Limit: 20 Sec Memory Limit: 128 MBSec Special Judge
Submit: 128 Solved: 49
[Submit][Status][Discuss]
Description
不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒。你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k。
Input
Output
Sample Input
1
1
2
2
2
3
7
3
Sample Output
HINT
Source
鸣谢Claris上传
Solution
考虑不满足条件的情况,肯定是叶节点中出现了叛徒,然后不断往上传染。
考虑树形DP,f[i]为i节点不变成叛徒的最小的比例,当i为叶节点时,f[i] = 1.0。
转移:f[i] = max{f[i], min(f[son[i]], 1.0*siz[son[i]]/(son[i]-1))};
其儿子不变成叛徒的最小比例为x,小于x,则其儿子会变成叛徒;其儿子所占的比例为y,小于y,则其儿子变成叛徒后会影响到它。
故取p = min(x,y),小于p,则它会变成叛徒。取max{p},是为了让它的所有儿子都不影响到它。
答案就是所有子树大小大于k的f[i]的max值。
且需要注意,一开始只有一个叛徒,也就是说传染最多只会传染完某一棵子树。
Code
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5+;
const double EPS = 1e-;
#define REP(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define REP_EDGE(i, a) for (int i = (a); i != -1; i = e[i].nxt)
#define mset(a, b) memset(a, b, sizeof(a))
int fcmp(double x) { if (x > -EPS && x < EPS) return ; return x < -EPS ? - : ; }
double max_(const double &AI, const double &BI) { return fcmp(AI-BI) == ? AI : BI; }
double min_(const double &AI, const double &BI) { return fcmp(AI-BI) == - ? AI : BI; }
int n, k;
struct Edge
{
int v, nxt;
Edge (int v = , int nxt = ): v(v), nxt(nxt) {}
}e[maxn];
int head[maxn], label, siz[maxn];
double f[maxn]; void ins(int u, int v) { e[++label] = Edge(v, head[u]), head[u] = label; } void dfs(int u, int fa)
{
siz[u] = ;
REP_EDGE(i, head[u])
if (e[i].v != fa)
dfs(e[i].v, u), siz[u] += siz[e[i].v];
if (siz[u] == ) { f[u] = 1.0; return ; }
f[u] = 0.0;
REP_EDGE(i, head[u])
if (e[i].v != fa)
f[u] = max_(f[u], min_(1.0*siz[e[i].v]/double(siz[u]-), f[e[i].v]));
} int main()
{
scanf("%d %d", &n, &k);
REP(i, , n) head[i] = -;
label = -;
REP(i, , n){ int u; scanf("%d", &u), ins(u, i); }
dfs(, );
double ans = 0.0;
REP(i, , n)
if (siz[i] > k) ans = max_(ans, f[i]);
printf("%.8lf\n", ans);
return ;
}
BZOJ 4726 POI 2017 Sabota? 树形DP的更多相关文章
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- BZOJ 4726: [POI2017]Sabota? 树形dp
4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- BZOJ 2435 道路修建 NOI2011 树形DP
一看到这道题觉得很水,打了递归树形DP后RE了一组,后来发现必须非递归(BFS) 递归版本84分: #include<cstdio> #include<cstring> #in ...
- BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
随机推荐
- vm tools安装包为空
新装了linux mint虚拟机之后突然发现安装vm tools时为空 1.关闭虚拟机2.打开设置 3.把CD/DVD(SATA)从安装系统时挂载的镜像改为自动检测 4.重启安装vm tools发现没 ...
- Python-Web框架的本质
Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. Python中使用socket和 ...
- Vue项目实现excel导出
1.package.json里面安装三个插件 npm install xlsx --save npm install script-loader –save-dev npm install ...
- 夜神模拟器调试android studio项目
这几天为了android studio也是醉了,先是R文件丢失忙活一下午,各种百度谷歌,最后终于解决这个小问题,没想到在启动avd这个问题上更是棘手,网上的方法试了,主要有三种,上篇博文http:// ...
- 洛谷P2018消息传递
传送门啦 这个树形dp就没那么简单了,运用了一下贪心的思想 不同的排序方法对应着不同的转移方程,如果我们用 $ f[x] = max(f[x] , b[i] +cnt - i + 1) $ 来进行转移 ...
- 使用JS实现文字搬运工
使用JS实现文字搬运工 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html><head><meta http-equiv=&quo ...
- 网络协议之UDP
前言 TCP协议在不可靠的网络环境上提供了可靠的通信通道,隐藏了大量的底层细节,使应用程序更加简洁.但有些应用并不需要这么高的可靠性,并不需要按序交付,而且TCP为了提高可靠性也增加了延时,在某些对延 ...
- thinkphp辅助方法,数据库操作
- NOIP2002普及T3【产生数】
做完发现居然没人用map搞映射特意来补充一发 很容易看出这是一道搜索题考虑搜索方案,如果按字符串转移,必须存储每种状态,空间复杂度明显会爆炸观察到每一位之间是互不影响的 考虑使用乘法原理搜索出每一位的 ...
- SQL中EXCEPT和Not in的区别?
初始化两张表: CREATE TABLE tb1(ID int) INSERT tb1 SELECT NULLUNION ALL SELECT NULLUNION ...