BZOJ4726——[POI2017]Sabota?

来源:互联网 发布:qq主题下载软件 编辑:程序博客网 时间:2024/05/20 01:35

1、题意:某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过x,那么这个人也会变成叛徒,并且他的所有下属都会变成叛徒。你要求出一个最小的x,使得最坏情况下,叛徒的个数不会超过k。
2、分析:不是很懂为什么这种水题没人做。。答案满足单调性。那就二分呗,接下来就是判断了,因为只有一个人最开始是叛徒。。判断的时候一棵子树里面最坏情况就是把所有子树去最大值,然后看是否比例超过x,xjb玩玩就行了,不知道正解是啥系列。

#include <map>#include <set>#include <cmath>#include <queue>#include <vector>#include <bitset>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define M 500010#define LL long long#define MOD 1000000007#define inf 2147483647#define eps 1e-7#define llinf 4000000000000000000ll#define For(i, x, y) for(int i = (x); i < (y); i ++)#define rep(i, x, y) for(int i = (x); i <= (y); i ++)#define drep(i, x, y) for(int i = (x); i >= (y); i --)inline int read(){    char ch=getchar();int x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}inline LL llread(){    char ch=getchar();LL x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}vector<int> G[M];int n, k;int Size[M], fa[M], mx[M];inline void add(int x, int y){    G[x].push_back(y);}inline void get_size(){    rep(i, 1, n) Size[i] = 1;    drep(i, n, 1) Size[fa[i]] += Size[i];    rep(i, 1, n) Size[i] --;}inline bool check(double x){    rep(i, 1, n) mx[i] = 0;    drep(i, n, 1){        if(Size[i]) if(mx[i] / (double)Size[i] - x > eps) mx[i] = Size[i] + 1;        mx[i] = max(mx[i], 1);        mx[fa[i]] = max(mx[fa[i]], mx[i]);    }    if(mx[1] <= k) return true;    return false;}int main(){    //freopen("0input.in", "r", stdin);    n = read(), k = read();    rep(i, 2, n) add(fa[i] = read(), i);    get_size();// rep(i, 1, n) printf("%d\n", Size[i]);    double l = 0.0, r = 1.0, ans;    while(abs(r - l) > eps){        double mid = (l + r) / 2.0;        if(check(mid)) r = (ans = mid);        else l = mid;    }    printf("%.9lf", ans);    return 0;}
0 0
原创粉丝点击