【BZOJ-4726】Sabota? 树形DP】的更多相关文章

4726: [POI2017]Sabota? 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4726 Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变 成叛徒.你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k. Input 第一行包含两个正…
4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved: 49[Submit][Status][Discuss] Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒…
题目描述的实际是一颗二叉树,对于每个结点,要么满叉,要么无叉. 对于一种无解的简单情况,我们搜一遍树找到最浅的叶子结点1和最深的叶子结点2,如果dep[1]<dep[2]-1,则显然无解. 所以现在所有的叶子结点的深度要么是dep[1]和dep[2]. 我们可以把所有结点用node[x]标记状态. node[x]=0表示x的子树下所有叶子结点深度都是dep[2]. node[x]=1表示x的子树下一部分叶子结点深度是dep[1],一部分是dep[2]. node[x]=2表示x的子树下所有叶子结…
题目大意 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小.N<=10000 题解 我们可以猜一个结论,用到的编号不会超过某一个值 我们发现我们可以开到100以上都不会超时 所以我们把编号最多100算,跑树形dp即可 其实可以证明编号不会超过logn... Code #include <cstdio> #include <cstring> #include <algor…
Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变 成叛徒.你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k. Input 第一行包含两个正整数n,k(1<=k<=n<=500000). 接下来n-1行,第i行包含一个正整数p[i+1],表示i+1的父亲是p[i+1](1<=p[i+1]&…
3090: Coci2009 [podjela] Description 有 N 个农民, 他们住在 N 个不同的村子里. 这 N 个村子形成一棵树.每个农民初始时获得 X 的钱.每一次操作, 一个农民可以从它自己的钱中, 取出任意数量的钱, 交给某个相邻村子的农民. 对于每个农民给定一个值 v_i, 求    (1) 最少需要多少次操作, 使得每个农民最终拿到的钱 >= 给定的值. Input 第1行: 一个整数 N (1 <= N <= 2000)    第2行: 一个整数 X (0…
思路:随便想想就能想出来啦把...  卡了我一个vector... #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int,int> #define piii pair<int, pair<int,int> > using namespace std; ; + ; cons…
[BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变 成叛徒.你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k.   Input 第一行包含两个正整数n,k(1<=k<=n<=500000). 接下来n-1行,第i行包含一个正整数p[i+1],…
题意 给一颗树,删除一条边再加一条边,使它仍为一颗树且任意两点间的距离的最大值最小. 题目数据范围描述有问题,n为1或重建不能使任意两点距离最大值变小,可以输出任意答案. 分析 删除一条边后会使它变成两颗树,两棵树的直径的中点相连一定是使距离最小的 红色的边为删除重建的边 在树上dp维护每个子树的最大直径\(h[x]\),和去除这个子树后的树的最大直径\(t[x]\),u为x的父亲,删除u-x这条边并重建后的树的最大直径为 \[\max\{\frac{h[x]+1}{2}+\frac{t[x]+…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4987 其实就是在树上找有 k 个点的连通块(路径上的点都选是最优的),之间的边都走了两遍,只有一条路径(a[1] -> a[k])走了一遍: 于是 f[x][j][0/1/2] 表示以 x 为根的子树内选了 k 个点,有 0/1/2 个端点(路径结尾)的最小值: 但是为什么转移必须是推过去而不能是加回来?TLE...?真是太奇怪了. 代码如下: #include<iostream>…