【题解】CF#Bubble Cup X - Finals E-Casinos and travel

  天啊我怎么这么蠢……写了一个树形dp,的确发现记录的很多值并没有什么用,然而当时脑子没转过弯来还是写了这个树形dp……虽然能A但就不解释了,总之是个垃圾算法(??д??)

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
#define mod 1000000007
#define int long long
int n, ans, rec, fa[maxn];
int g[maxn][2], f[maxn][2];

int read()
{
    int x = 0, k = 1;
    char c; c = getchar();
    while(c < ‘0‘ || c > ‘9‘) { if(c == ‘-‘) k = -1; c = getchar(); }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * k;
}

struct edge
{
    int cnp, to[maxn], last[maxn], head[maxn];
    edge() { cnp = 2; }
    void add(int u, int v)
    {
        to[cnp] = v, last[cnp] = head[u], head[u] = cnp ++;
        to[cnp] = u, last[cnp] = head[v], head[v] = cnp ++;
    }
}E1;

void Up(int &x, int y) { x = (x + y) % mod; }
int Inv(int x)
{
    int base = 1, timer = mod - 2;
    for(; timer; timer >>= 1, x = x * x % mod)
        if(timer & 1) base = base * x % mod;
    return base;
}

void dfs(int u)
{
    int t1 = 1, flag = 0;
    for(int i = E1.head[u]; i; i = E1.last[i])
    {
        int v = E1.to[i];
        if(v == fa[u]) continue; fa[v] = u;
        dfs(v); flag = 1;
        t1 = t1 * ((g[v][0] + g[v][1]) % mod) % mod;
    }
    if(flag) g[u][0] = g[u][1] = t1 % mod;
    else g[u][0] = 1, g[u][1] = 0;
}

void dfs2(int u)
{
    int t1 = f[fa[u]][0] * g[fa[u]][0] % mod * Inv(g[u][0] + g[u][1]) % mod;
    int t2 = f[fa[u]][1] * g[fa[u]][1] % mod * Inv(g[u][0] + g[u][1]) % mod;
    f[u][0] = f[u][1] = (t1 + t2) % mod; if(u == 1) f[u][0] = 1; if(u == 1 && rec != 1) f[u][1] = 1;
    Up(ans, (f[u][0] * g[u][0]) % mod * 2 % mod);
    for(int i = E1.head[u]; i; i = E1.last[i])
    {
        int v = E1.to[i];
        if(v == fa[u]) continue;
        dfs2(v);
    }
}

signed main()
{
    n = read();
    for(int i = 1; i < n; i ++)
    {
        int x = read(), y = read();
        E1.add(x, y); if(x == 1 || y == 1) rec ++;
    }
    dfs(1); dfs2(1);
    printf("%I64d\n", ans);
     return 0;
}

  其实我们可以直接推公式。我们注意到每个叶子结点完全可以决定从根到的路径上的节点是偶数个还是奇数个,也就是它本身是否建造赌场是一定的。至于剩下的节点,我们大可以随便决定。所以 \(ans = (n - x) * 2^{n - x} + x * 2 ^ {n - x + 1}\)。(其中 \(x\) 为叶子节点的个数)。那么整理一下就是 \(ans = (n + x) * 2 ^ {n - x}\)。

原文地址:https://www.cnblogs.com/twilight-sx/p/9753631.html

时间: 2024-11-10 11:11:46

【题解】CF#Bubble Cup X - Finals E-Casinos and travel的相关文章

Bubble Cup 11 - Finals [Online Mirror, Div. 1] 体验记 + 部分题解

原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045.html 体验?? 陈老爷(cly_none) 带我们飞. 遥遥领先的yzy(yzyyylx) nb . fx 口胡大法好. 哈哈.最后7~8分钟卡常 5974ms 过一道 6000ms 题. 陈老爷切掉了 A D J . yzy 干掉了 C 和 G . fx 半程口胡.中途有事. zzd 菜鸡贡献10多发罚时,导致队伍罚时爆炸.这个菜鸡zzd只 AC 了 I B H ,并在最后7~8分钟把陈老爷

Bubble Cup 8 finals C. Party (575C)

题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量=人的数量=n,2<=n<=20,且n是偶数. 0<=每一项满意度<=10^6. 时间限制2s,空间限制4MB. 题解: 在这题上卡了很久… 初看这题觉得是费用流…写完发现图建错了… 然后改成暴力枚举哪些人在第一天晚上去再跑费用流… 每个人只和对应晚上的夜总会连边,然后两天晚上的夜总会再

Bubble Cup X - Finals [Online Mirror]

来自FallDream的博客,未经允许,请勿转载,谢谢. 组了个菜鸡队打cf上的ACM比赛 比较快做完了8题但是菜的抠脚罚时巨多,所以最后被顶到了19名(居然没出首页) 自己的号自从上次疯狂掉分就没动过了,感觉像是红名橙名大佬中的一股清流. A.奇怪的贪心,我写了一发结果挂了,题解见大爷博客 B.dp方程很容易列出来,然后写个矩阵乘法就行了. C.每个点的位置决定了两边的白色小三角形的面积,这个面积是关于位置的一次函数,所以排序之后贪心就行了. D.二分+网络流判定 E.dp方程容易列出,然后换

Bubble Cup 8 finals I. Robots protection

题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<=5000 1<=询问数<=10^5 保证输入合法,三角形被正方形区域完全包含. 题解: 嗯这是一道数据结构题… 一开始我想起来之前做过但没做出来的一道三角形修改三角形查询的分块题… 然后…GEOTCBRL说,是k-d tree呀,CF上面有标程代码长度限制的… 然而我并不会用k-d tree做这个

Bubble Cup 8 finals G. Run for beer (575G)

题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1<=边数<=10^5, 1<=点数<=10^5, 0<=边权<=9 题解: 比较有趣的一道题…难度不算太高,但一些地方比较容易想错… 这题的边代价可变本身并不是什么大问题,因为是图中所有边一起变大, 但是一开始就会遇到一个问题,就是总代价数字过大,没有办法直接存储和比较. 观察到

Bubble Cup 8 finals B. Bribes (575B)

题意: 给定一棵n个点和有向边构成的树,其中一些边是合法边,一些边是非法边, 经过非法边需要1的费用,并且经过之后费用翻倍. 给定一个长为m的序列,问从点1开始按顺序移动到序列中对应点的总费用. 1<=n<=10^5, 1<=m<=10^6 题解: 还是比较水的… 正解是各种方法求LCA,在点上打标记,最后DFS一遍就可以得到答案. 用tarjan求LCA可以做到总复杂度O(n*α)… 我傻傻地见树就剖,强行O(n log n log n)碾过去了… 每次把起点终点之间的路径的经过

Bubble Cup 8 finals H. Bots (575H)

题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. 显然,前n层的边的颜色是任意的,所以第i层就是2^i个点. 对于后n层,可以直接由上一层转移. 因为已经知道上一层合法的个数,那么如果现在每个点扩展两条边, 那么上一层的状态中,某种颜色的个数已经达到n的情况就有一条边不可扩展, 所以要减去2*C(i-1,n). 1 2 3 4 5 6 7 8 9 10 11

Bubble Cup 8 finals D. Tablecity (575D)

题意: (无输入,纯输出题) 一个城市用1000列2行的格子表示,一个小偷藏在城市的某一处. 在每一小时的开始, 在(X, Y)位置的小偷可以移动到 (X - 1, Y), (X + 1, Y),(X - 1, Y - 1), (X - 1, Y + 1), (X + 1, Y - 1), (X + 1, Y + 1)中的任意一个位置. 在每一小时中,警察可以控制搜索两个格子,如果小偷藏在这个格子就会被发现. 请输出一种方案, 使得在2015小时内,对于小偷的初始位置和移动方法的所有可能情况都能

Bubble Cup 8 finals E. Spectator Riots (575E)

题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三个位置要求满足在一秒之后可能会出现观众. (这里不需要考虑概率大小,只要概率不为0就是满足的) 然后过这三点作圆,请选取在初始状态一秒后圆内观众数的期望值最大的方案输出. 如果有多种,输出半径最大的方案. 题解: 第一眼看起来非常可怕… 什么每秒移动速度呀…什么期望呀…先被吓死就做不了了… 其实是假装要扯