zoj 3734 LIKE vs CANDLE
树形dp。因为最终答案要求的是差值,所以对于每个节点我们只需要考虑差值即可,dp[u][0]表示u节点以下(含u)中like的val比candle的val大的最大值,dp[u][1]表示candle的val值比like大的最大值。所以,对于每个节点我们就可以对于每个子树v:
dp[u][0] += dp[v][0];
dp[u][1] += dp[v][1];
但是对于原来已经翻转过的点,我们要无偿交换swap(dp[u][0], dp[u][1]);这点应该很明确(因为我们本来求的是没有翻转过的,现在由于这一点本来翻转过,导致我们本来求的东西都是相反的,所以要交换一下)。
这样的话就可以使得两个值都最大,然后再考虑翻转的情况,如果翻转的话,那么可以这样更新dp值。
dp[u][0] = max(dp[u][0], dp[u][1] - sub);
dp[u][1] = max(dp[u][1], dp[u][0] - sub);
sub表示翻转需要的代价。
然后需要注意的一点就是对于树根0,我们不能翻转,根据题目可以很容易看出来。
#include<functional>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define LL long long
using namespace std;
const int N = 50500;struct Node
{int v, s, p;Node(){}Node(int v, int s, int p):v(v), s(s), p(p){}
}node[N];vector<int> E[N];
int x, y, n;
int dp[N][2];void dfs(int u)
{int sub;dp[u][0] = node[u].v;dp[u][1] = -node[u].v;for(int i = 0; i < E[u].size(); i ++){int v = E[u][i];dfs(v);dp[u][0] += dp[v][0];dp[u][1] += dp[v][1];}if(node[u].s) sub = y;else sub = x;if(u){if(node[u].s) swap(dp[u][0], dp[u][1]);dp[u][0] = max(dp[u][0], dp[u][1] - sub);dp[u][1] = max(dp[u][1], dp[u][0] - sub);}
}int main()
{int v, s, p, f;while(scanf("%d%d%d", &n, &x, &y) != EOF){for(int i = 0; i <= n; i ++) E[i].clear();for(int i = 1; i <= n; i ++){scanf("%d%d%d%d", &v, &f, &s, &p);if(p) v = -v;node[i] = Node(v, s, p);E[f].push_back(i);}dfs(0);if(dp[0][0] < 0) puts("HAHAHAOMG");else printf("%d\n", dp[0][0]);}
}
zoj 3734 LIKE vs CANDLE相关推荐
- ZOJ 3734: LIKE vs CANDLE
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3734 题目大意: 若干微博账户形成了一个转发树(即一个有根树) ...
- c语言 宏定义swap函数,C++ 用宏实现swap(a,b)
sql语句注意事项 1两表根据a字段关联,把t2表中的c字段值更新到t1表中的c字段update T1set T1.C =(select T2.C from T2 where T1.A = T2.A) ...
- HDU 4430 amp; ZOJ 3665 Yukari#39;s Birthday(二分法+枚举)
主题链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4430 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...
- ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!
两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...
- zoj 1204 Additive equations
ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题.所以我很是天 ...
- 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)
http://poj.org/problem?id=1411 POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...
- 模拟 ZOJ 3878 Convert QWERTY to Dvorak
题目传送门 1 /* 2 模拟:手敲map一一映射,累! 3 除了忘记读入字符串不能用gets用getline外还是很顺利的AC了:) 4 */ 5 #include <cstdio> 6 ...
- 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...
最新文章
- Python入门学习方法有哪些?
- netcore 获取本地网络IP地址
- 计算机三级交换机允许中继配置,计算机三级交换机配置命令总结
- SQL中Group By的使用,以及一些特殊使用方法
- Android studio 开发中 用git实现批量忽略特定文件的方法
- SAP Cloud Platform上Destination属性为odata_gen的具体用途
- 专访《突破》作者刘朋: 程序员快速提升领导力的15个模式!
- 使用匿名函数动态设置前置或者后置操作(装饰器模式的)
- 基于android的课程画图设计,基于Android的智能终端通信勘察设计系统绘图模块的设计与实现...
- 小米路由器爆款产品遭遇友商恶意抹黑 官方怒晒黑稿...
- Java基础学习总结(102)——Java相关的开源项目
- Spring Boot入门(2)-项目属性配置
- 3d slicer调整窗宽窗位_3D游戏模型制作技巧,掌握这些技术你也能进鹅厂!
- Android中热更新实现--Sophix方案
- 嵌入式linux系统蜂鸣器实验,嵌入式系统原理实验四蜂鸣器.docx
- 采购人必须明白的八大发展趋势及原则
- 微信壁纸小程序(SpringBoot后台V1.3.0发布)
- linux 校园网 自动认证,使用 Padavan 路由器实现校园网自动 Web 认证
- html word-break,HTML Style wordBreak用法及代码示例
- 什么是python的内置函数_什么是python内置函数