VK Cup 2015 - Round 2 B. Work Group

题解:

树形dp

首先开始做时我以为只要贪心选取就可以了...

后来发现根节点可以不用选,而选和为奇数的满足条件的子节点.

所以需要重新构建状态

dp[u][0]表示满足条件的以u为根节点的子树中,节点数为偶数的最大值

dp[u][0]表示满足条件的以u为根节点的子树中,节点数为奇数的最大值

最开始不选根节点.dp[u][0]=0,dp[u][1]为-INF(不存在)

每次加子节点v时

1.偶可以由偶(u)+偶(v),奇(u)+奇(v)更新

2.奇可以由奇(u)+奇(v),奇(u)+奇(v)更新

最后当子节点条件完后,所有子节点的和为偶的情况可以加上根节点

dp[u][1]=max(dp[u][1],dp[u][0]+1);

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=200005;
const int mod=1000000007;
int n,x;
int w[maxn];
ll dp[maxn][2];
vector<int> s[maxn];

void dfs(int u)
{
    dp[u][0]=0;dp[u][1]=-(1LL<<60);
    for(int i=0;i<s[u].size();i++)
    {
        int v=s[u][i];
        dfs(v);
        ll t0=dp[u][0],t1=dp[u][1];
        t0=max(t0,dp[u][0]+dp[v][0]);
        t0=max(t0,dp[u][1]+dp[v][1]);
        t1=max(t1,dp[u][1]+dp[v][0]);
        t1=max(t1,dp[u][0]+dp[v][1]);
        dp[u][0]=t0;
        dp[u][1]=t1;
    }
    dp[u][1]=max(dp[u][1],dp[u][0]+w[u]);
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&x,&w[i]);
        if(x==-1) continue;
        s[x].push_back(i);
    }
    dfs(1);
    printf("%lld\n",max(dp[1][0],dp[1][1]));
    return 0;
}
时间: 2024-11-03 01:25:11

VK Cup 2015 - Round 2 B. Work Group的相关文章

VK Cup 2015 - Round 1 E. Rooks and Rectangles 线段树 定点修改,区间最小值

E. Rooks and Rectangles Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/524/E Description Polycarpus has a chessboard of size n × m, where k rooks are placed. Polycarpus hasn't yet invented the rules of the game

Codeforces VK Cup 2015 Wild Card Round 1 (AB)

比赛链接:http://codeforces.com/contest/522 A. Reposts time limit per test:1 second memory limit per test:256 megabytes One day Polycarp published a funny picture in a social network making a poll about the color of his handle. Many of his friends started

Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) B. T-Shirt Hunt

B. T-Shirt Hunt time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Not so long ago the Codecraft-17 contest was held on Codeforces. The top 25 participants, and additionally random 25 participant

Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树形动态规划)

原题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801 题意:给定一颗有根树,在树上下层的节点要给上层节点礼物,根节点的礼物则给慈善会,但是给礼物有个条件就是你不能送你的父节点已经送出的礼物.问满足要求的最少花费. 题解:这个题卡了一段时间,类似于染色问题,可以用树形动态规划求解.因为已知节点个数为N,则我们单个节点的最大花费不会超过log2(N) = 18. 1.

hacker cup 2015 Round 1 解题报告

A:求区间内素因子个数等于n的数有多少个 解题思路:筛法 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年01月18日 星期日 13时54分20秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include&

Facebook Hacker Cup 2015 Round 1--Winning at Sports(动态规划)

原题:https://www.facebook.com/hackercup/problems.php?pid=688426044611322&round=344496159068801 题意:你和一个朋友玩足球游戏,分数从0-0开始,最终你总是赢,并且你主要有两种方式赢,第一种stressFree方式你肯定要进第一个球并且总是比你的朋友分数高,第二种stressFull方式除了你的朋友达到最终分数时,在游戏中你不可能比你的朋友分数高.给出一个比分,请分别输出在两种情况下你能赢的方式. 题解:类似

Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) C

Description In the army, it isn't easy to form a group of soldiers that will be effective on the battlefield. The communication is crucial and thus no two soldiers should share a name (what would happen if they got an order that Bob is a scouter, if

Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition)

A. Bear and Game 题意:一个体育节目,它可能在某一分钟是很有趣的,其他时间都是很无聊的,如果持续十五分钟都很无聊的话那么Bear就会关掉电视,问什么时候会关掉电视. 题解:用第i个有趣的时间减去第i-1个有趣的时间,如果差值大于十五分钟那就输出第i个有趣的时间+15.注意第一个有趣的时间要为0,最后一个为90. 代码: 1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 const int maxn=95; 6 7 int

[树形DP]VK Cup 2012 Round 1 D. Distance in Tree

题意: 给出一棵树,然后问任意两点间距离为k的情况有多少种. 分析: 显然是DP,但是状态方程如何向呢?一棵树,肯定是先从根节点开始考虑情况,那么就把每个点看做是一课子树,然后dp[i][j] 表示计算到i点时距离为k的情况的种类数.然后扫描该点的子节点,递归,完了之后 ans+=dp[x][j-1]*dp[v][k-j]; 表示到i节点的距离和到子节点中的距离==k-1的所有情况,为什么是k-1 ,而不是k呢,因为x和子节点之间还有一条边的长度,然后更新x节点. 这里累加答案和更新x的顺序很重