Codeforces Round #263

来源:互联网 发布:linux源码目录 编辑:程序博客网 时间:2024/05/22 12:09

http://codeforces.com/contest/461


A.水题

B.太挫了,居然被hack了一发。。。。

C.贪心。。居然没看出来时哈夫曼编码问题

D.题目大意:给一棵树,每个点为白色或黑色,切断一些边,使得每个连通块有且仅有一个黑点,问划分方案数。

树形DP,
设状态:
dp[v][0]表示以v为根的子树中没有黑点,dp[v][1]有一个黑点。
状态方程:
dp[v][1] = dp[v][1]*dp[son][0] + dp[v][0]*dp[son][1] + dp[v][1]*dp[son][1]
dp[v][0] = dp[v][0]*dp[son][0] + dp[v][0]*dp[son][1]
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int mod=1000000007;const int maxn = 100000 + 100;vector<int> g[maxn];int clr[maxn];LL dp[maxn][2];int n;void dfs(int u, int p){    dp[u][clr[u]] = 1;    for(int i=0; i<g[u].size(); ++i)    {        int &v = g[u][i];        if(v==p) continue;        dfs(v, u);        dp[u][1] = (dp[u][1]*dp[v][0]%mod + dp[u][0]*dp[v][1]%mod + dp[u][1]*dp[v][1]%mod) % mod;        dp[u][0] = (dp[u][0]*dp[v][1]%mod + dp[u][0]*dp[v][0]%mod) % mod;    }}int main(){    scanf("%d", &n);    int x;    for(int i=1; i<n; ++i)    {        scanf("%d",&x);        g[i].push_back(x);        g[x].push_back(i);    }    for(int i=0; i<n; ++i)    {        scanf("%d", &clr[i]);    }    dfs(0, -1);    printf("%I64d\n", dp[0][1]);    return 0;}


E.


Div1 D Appleman and Complicated Task


Div1 E Appleman and a Game
1 0
原创粉丝点击