树形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相关推荐

  1. ZOJ 3734: LIKE vs CANDLE

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3734 题目大意: 若干微博账户形成了一个转发树(即一个有根树) ...

  2. 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) ...

  3. 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 ...

  4. ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!

    两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...

  5. zoj 1204 Additive equations

    ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题.所以我很是天 ...

  6. 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)

    http://poj.org/problem?id=1411  POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...

  7. 模拟 ZOJ 3878 Convert QWERTY to Dvorak

    题目传送门 1 /* 2 模拟:手敲map一一映射,累! 3 除了忘记读入字符串不能用gets用getline外还是很顺利的AC了:) 4 */ 5 #include <cstdio> 6 ...

  8. 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

    题目传送门 1 /* 2 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 3 矩阵连乘积问题,DP解决:状态转移方程: 4 dp[i][j] = min (dp[i][k] + dp[k+1] ...

  9. ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)

    ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...

最新文章

  1. Python入门学习方法有哪些?
  2. netcore 获取本地网络IP地址
  3. 计算机三级交换机允许中继配置,计算机三级交换机配置命令总结
  4. SQL中Group By的使用,以及一些特殊使用方法
  5. Android studio 开发中 用git实现批量忽略特定文件的方法
  6. SAP Cloud Platform上Destination属性为odata_gen的具体用途
  7. 专访《突破》作者刘朋: 程序员快速提升领导力的15个模式!
  8. 使用匿名函数动态设置前置或者后置操作(装饰器模式的)
  9. 基于android的课程画图设计,基于Android的智能终端通信勘察设计系统绘图模块的设计与实现...
  10. 小米路由器爆款产品遭遇友商恶意抹黑 官方怒晒黑稿...
  11. Java基础学习总结(102)——Java相关的开源项目
  12. Spring Boot入门(2)-项目属性配置
  13. 3d slicer调整窗宽窗位_3D游戏模型制作技巧,掌握这些技术你也能进鹅厂!
  14. Android中热更新实现--Sophix方案
  15. 嵌入式linux系统蜂鸣器实验,嵌入式系统原理实验四蜂鸣器.docx
  16. 采购人必须明白的八大发展趋势及原则
  17. 微信壁纸小程序(SpringBoot后台V1.3.0发布)
  18. linux 校园网 自动认证,使用 Padavan 路由器实现校园网自动 Web 认证
  19. html word-break,HTML Style wordBreak用法及代码示例
  20. 什么是python的内置函数_什么是python内置函数

热门文章

  1. mysql数据库最后一步卡住了_[数据库]解决MySQL安装到最后一步未响应的三种方法...
  2. 《商业银行设立基金管理公司试点管理办法》
  3. vivo 全球商城:电商平台通用取货码设计
  4. python--字典版学生成绩管理系统
  5. CDISC 简单介绍
  6. 【安全工具】Nmap基本使用方法
  7. 地图叠加图片切片:通过输入经纬度定位地图配准点
  8. python读取摄像头数据_Opencv 读取摄像头数据 | 代码驱动科技
  9. win10永久关闭实时保护
  10. Windows文件夹管理利器 Clover,值得你拥有