HDU 3660 树形DP
题意
Alice与Bob在一棵树的树根一同出游,两人从Bob开始轮换选择道路一直走到树叶,Alice会尽可能使走过的总长最小,而Bob相反。不过他们都不能让总长落到[l, r]之外
现在给出这棵树和l,r,要求我们判断最终走过的总长落到[l, r]内,如果能,则输出这个总长,否则输出Oh, my god!
思路
由于两人都是最理性地考虑自己的选择,并且在某点由哪个人选择道路是已知的,所以可以使用DP
在某个节点,从子节点的预期长度中选出使最终路径长度落在[l, r]内并且最大(小)的一个,加上对应的这条道路的长度,就是本节点到叶子节点的预期长度。
在hdu上交的时候要注意优化,但是似乎这题数据太强了,即使通过也是和时限差了50ms,可以去做相同的uva-1484,数据要友好很多。
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
long long l, r;
int fir[500005], nex[500005], vv[500005];
int ff[500005], ww[500005];
void dfs(int o, int d, int v)
{
if (fir[o] == -1)
{
if (v > r || v < l)
{
ff[o] = -1;
return;
}
ff[o] = 0;
return;
}
ff[o] = d % 2 ? -1 : 99999999;
for (register int i = fir[o]; i != -1; i = nex[i])
{
dfs(vv[i], d + 1, v + ww[i]);
if (ff[vv[i]] == -1 || ff[vv[i]] == 99999999)
{
continue;
}
int acc = ff[vv[i]] + v + ww[i];
if (acc > r || acc < l)
{
continue;
}
if (d % 2)
{
ff[o] = max(ff[o], ww[i] + ff[vv[i]]);
}
else
{
ff[o] = min(ff[o], ww[i] + ff[vv[i]]);
}
}
return;
}
int main()
{
while (scanf("%d%lld%lld", &n, &l, &r) != EOF)
{
memset(fir, -1, sizeof(int) * (n + 2));
for (register int i = 1; i < n; ++i)
{
int u;
scanf("%d%d%d", &u, &vv[i], &ww[i]);
nex[i] = fir[u];
fir[u] = i;
}
dfs(0, 1, 0);
if (ff[0] != -1 && ff[0] != 99999999)
{
printf("%d\n", ff[0]);
}
else
{
printf("Oh, my god!\n");
}
}
return 0;
}
HDU 3660 树形DP的更多相关文章
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- HDU 1520 树形dp裸题
1.HDU 1520 Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...
- HDU 1561 树形DP入门
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2196树形DP(2个方向)
HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...
- HDU 1520 树形DP入门
HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...
- codevs 1380/HDU 1520 树形dp
1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...
- HDU 5834 [树形dp]
/* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...
- hdu 4267 树形DP
思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...
- hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...
- hdu 1520 (树形DP)
dp[i][0]表示i不参加 dp[i][1]表示i参加 简单的树形dp #include<stdio.h> #include<string.h> #define N 6100 ...
随机推荐
- TIPTOP GP ERP二次开发规范说明
TIPTOP GP ERP二次开发规范说明 TIPTOP ERP共分三大区:topstd(标准区) + toppord(正式区) + toptest(测试区) 标准区 ...
- 9. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP2改造篇之HPACK示例, 了解http2头信息如何处理
9. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP2改造篇之HPACK示例, 了解http2头信息如何处理 项目 ++wmproxy++ gite: https://gite ...
- 一行代码搞定 font-size 响应式
前言 公司要做大屏,但是大屏还要有个嵌在系统的版本,屏幕(iframe)小了但字体大了怎么办.网上找了很多代码都很长,个人参考了资料后实现了一个一行代码 font-size 响应式. TL;DR ht ...
- Java并发编程和多线程的区别
并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和高效处理多个并发任务的程序.并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程.协程.分布式编程等.并发编程的目标是实 ...
- Vue之交互
1.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- [Python急救站课程]输出水仙花数
python #d = 0 print("所有三位数中的水仙花数如下所示:") for i in range(100, 1000): a = i // 100 # 求百位数 b = ...
- 如何通过 wireshark 捕获 C# 上传的图片
一:背景 1. 讲故事 这些天计划好好研究下tcp/ip,以及socket套接字,毕竟工控中设计到各种交互协议,如果只是模模糊糊的了解,对分析此类dump还是非常不利的,而研究协议最好的入手点就是用抓 ...
- Python小白入门指南:避免踩雷的10大错误!
hello,大家好!新手小白踏入 Python 的大门有点像冒险,但别担心,我已经整理了一个超实用的入门指南,帮你规避学习过程中的十大雷区.这里有关于 Python 的错误你应该注意的建议,一起来看看 ...
- 字符串分割(String.Split)时连同分隔符一起返回
今天有个群友问了这个问题:"字符串分割时,如何连同分隔符一起返回?". 我这里写了个String扩展类,模仿原生的Split方法,与原生Split方法的区别在于多了个返回分隔符的枚 ...
- 潜在威胁信息模型(PTIM)-Potential threats Information Modeling
前言 这只是一位学识浅薄博主的一个突然想法,还望各位专业领域的专家教授轻怼 潜在威胁信息模型 目前的想法是通过全城摄像头建立城市的潜在威胁信息模型,这个潜在威胁可以包括:天气灾害(冰雹.雾霾能见度等) ...