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]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
随机推荐
- python面向对象——类
from:http://www.runoob.com/python3/python3-class.html Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在P ...
- C 语言问题
1. 如何生成 "半全局变量", 就是那种只能被部分源文件中的部分函数访问变量? 答: 这在C语言中办不到. 如果不能或不方便在一个源文件中放下所有的函数, 那么有三种的解决方案 ...
- tf.nn.embedding_lookup函数
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True, max_ ...
- 洛谷P2024食物链
传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...
- thinkphp5 IIS7.5 隐藏index.php的方法
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...
- mysql数据库查找类型不匹配
无意中看到10级学长的博客,提到了mysql数据库类型查找不匹配的问题,博客地址是:卢俊达 . 数据库中建表中会对每个属性进行类型划分,然后在查找数据库select时: MySQL 的文档 (Type ...
- jquery中获取radio选中值的正确写法
错误写法: //只在IE下有作用,其他浏览器均获取的为第一个单选框的值 $('input[type=radio]').val(); 正确写法为: //兼容所有浏览器写法 $('input[type=r ...
- jquery选择里存在特殊字符,需要加双转义字符
//元素为:<input type="checkbox" value="abc/index" /> //处理选择器转义问题 //去除值 $val = ...
- pymongo处理正则表达式的情况
在python里使用pymongo处理mongodb数据库,在插入或者查询的时候,我们有时需要使用操作符号,如set,in, 具体操作符的可以参考 https://docs.mongodb.com/ ...
- 7-13 Power Calculus 快速幂计算 uva1374
想到快速幂 但是这题用不上 用迭代加深搜索 注意启发函数为 当前最大数<<(maxx-d) 如果大于n则剪枝 注意跳出语句的两种写法 一种170ms 一种390ms !!! d ...