P5958 【[POI2017]Sabotaż】

题意描述

在一棵以1号节点为根节点的树上,有很多纯洁的白点,

BUT,突然有一个黑点出现(可能在任意位置)

它要染黑尽可能多的节点,而在一棵子树中,

只有当黑点的比例\(>x\)才可以染黑根节点(即整棵子树)

求x的最小值,使得整棵树中被染黑的节点数不超过\(k\)个

如果你看不懂请走传送门

算法分析

一道很裸的树形DP,但思路很巧

显然本题有以下性质:

  1. 最坏情况下,最开始的叛徒是叶子结点
  2. 因为一个节点被染黑了,一起为根节点的子树将全黑,所以最终被染黑的一定是一颗子树

先设计状态:\(f(i)\)表示使得\(i\)不变黑的最小\(x\)

易得:\(f(i)\)也是使得\(i\)变黑的最大\(x\)

可知\(f(i)\)仅与\(f(son{i})\)以及\(soni\)的大小有关(这里的\(soni\)表示\(i\)的子节点)

那么我们用\(sum(i)\)表示以\(i\)为根节点的子树的大小,\(sum(i)\)是需要提前用dfs预处理的

显然\(i\)被染黑仅必须满足以下两种情况:

  1. \(f(soni)<=x\),即\(i\)的某棵子树被染黑
  2. \(sum(soni)/(sum(i)-1)<=x\),即\(soni\)的被染黑足以导致\(i\)的被染黑

根据以上规律可以推出如下方程:

\(f(i)=max(f(i),min(f(soni),sum(soni)/(sum(i)-1)))\)(不会用LaTeX写公式的蒟蒻瑟瑟发抖)

取\(min\)是因为需要同时满足条件1和条件2,

取\(max\)是因为需要答案最优

(貌似貌似到这里就结束了呢)

其实还有以下三点细节需要注意:

  1. 对于叶子结点\(a\),显然有\(f(a)=1\)
  2. 对于\(ans\)当\(sum(a)<k\)时是不需要考虑的,因为它合法,所以即使它被染黑也无所谓
  3. 针对上一条结论,易得\(ans=max(ans,f(a))\),其中\(sum(a)>=k\)

然后就去快乐\(AC\)吧......

代码实现

警告:不要直接复制代码,如果你\(RE\)了你知道是为什么的

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define maxn 500050
using namespace std; int n,k,sum[maxn];
double f[maxn],ans;
vector<int>v[maxn];//用vector存图笑哈哈 void dfs(int now,int fa){
sum[now]=1;
for(int i=0;i<v[now].size();i++){
int to=v[now][i];
dfs(to,now);
sum[now]+=sum[to];
}//dfs预处理sum[]
if(sum[now]==1){f[now]=1.0;return;}//叶子结点的处理
for(int i=0;i<v[now].size();i++){
int to=v[now][i];
f[now]=max(f[now],min(f[to],(double)sum[to]/(sum[now]-1)));
}//dp
if(sum[now]>k) ans=max(ans,f[now]);//统计答案,注意if
return;
} int main(){
scanf("%d %d",&n,&k);
int x;
for(int i=2;i<=n;i++){
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1,0);
printf("%.8lf",ans);//注意精度问题
while(1){}//防作弊
return 0;
}

结语

安利dalao博客

(光速逃...

P5958 【[POI2017]Sabotaż】的更多相关文章

  1. 【POI2017||bzoj4726】Sabota?

    上学期putsnan过了一次,这学期认真写了一遍…… #include<bits/stdc++.h> #define N 500010 using namespace std; ]; ,n ...

  2. 【POI2017||bzoj4726】Flappy Birds

    外国人很良心的啊,这题比NOIP那题还简单…… 不用管他最后的位置,因为移动的次数肯定是恒定的,所以维护在每一个柱子的位置能飞到的范围,递推下去即可. #include<bits/stdc++. ...

  3. 【BZOJ4726】[POI2017]Sabota? 树形DP

    [BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者 ...

  4. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  5. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  6. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  8. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. 【.net 深呼吸】程序集的热更新

    当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...

随机推荐

  1. Python练习题 035:Project Euler 007:第10001个素数

    本题来自 Project Euler 第7题:https://projecteuler.net/problem=7 # Project Euler: Problem 7: 10001st prime ...

  2. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  4. 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码

    015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...

  5. Batch批处理 间断向EXE发送参数

    参考:https://blog.csdn.net/wjz1029/article/details/45044033 找了很久的一种方法: 怎样向一个EXE 发送一个参数,得到反馈后,再向EXE发送一个 ...

  6. nuget使用经验:复杂依赖关系下的包版本问题

    背景 之前同事问到过1个关于nuget包被多层引用后,最终生效的版本的问题.当时通过在项目中重新安装了一次nuget包解决了. 现在来重新复盘一下当时的场景,顺便把这种场景下nuget处理逻辑分享给大 ...

  7. JAVA学习线路:day01面向对象(继承、抽象类)

    所有的文档和源代码都开源在GitHub: https://github.com/kun213/DailyCode上了.希望我们可以一起加油,一起学习,一起交流. day01面向对象[继承.抽象类] 今 ...

  8. TP5自定义路由,为了安全性

    1,入口文件index.php,不要指定任意模块,不然,自定义路由,就不会有任何效果哦 2,在配置文件 route.php  中引进   use think\Router  自带路由文件 3,将路由进 ...

  9. mycat的privileges标签

    参考https://blog.csdn.net/tornadojava/article/details/54948662 privileges标签 对用户的 schema以及表进行精细化的DML权限控 ...

  10. 2017年 实验五  B2B模拟实验

    实验五  B2B模拟实验 [实验目的] ⑴.掌握B2B中供应商的供求信息发布.阿里商铺开设和订单交易等过程. ⑵.掌握B2B中采购商的采购信息的发布.交易洽谈.网上支付和收货等过程. [实验条件] ⑴ ...