原题地址

题意

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的更多相关文章

  1. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  2. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  3. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

  5. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  6. codevs 1380/HDU 1520 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...

  7. HDU 5834 [树形dp]

    /* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...

  8. hdu 4267 树形DP

    思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...

  9. hdu 4607 (树形DP)

    当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...

  10. hdu 1520 (树形DP)

    dp[i][0]表示i不参加 dp[i][1]表示i参加 简单的树形dp #include<stdio.h> #include<string.h> #define N 6100 ...

随机推荐

  1. bash: accelerate: command not found

    py AIGC Stable Diffusion文生图Lora模型微调实现虚拟上装详情     实验手册 实验报告   3. 安装Diffusers 进入PAI-DSW开发环境. 登录PAI控制台. ...

  2. PackageManager

    /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  3. CSS 多行文本超链接下划线动效

    先看效果 乍一看,是不是感觉很简单,仔细一瞅发现事情好像没有那么简单. 如果十分钟还没想出怎么实现,那就把简历上的"精通css"改成"了解css"-- 大部分人 ...

  4. Macos下用Clion调试chromium源码

    1:下载CLion 2021.1.3(网上有破解版) 2:选择File->Open 导入chromium源码 3:在Src同级目录新建一个CMakeLists.txt 4:点击clion编译按钮 ...

  5. [glibc] 带着问题看源码 —— exit 如何调用 atexit 处理器

    前言 之前在写 apue 系列的时候,曾经对系统接口的很多行为产生过好奇,当时就想研究下对应的源码,但是苦于 linux 源码过于庞杂,千头万绪不知从何开启,就一直拖了下来. 最近在查一个问题时无意间 ...

  6. python爬虫入门(1)-开发环境配置

    所谓的爬虫,就是通过模拟点击浏览器发送网络请求,接收站点请求响应,获取互联网信息的一组自动化程序. 也就是,只要浏览器(客户端)能做的事情,爬虫都能够做.      现在的互联网大数据时代,给予我们的 ...

  7. MySQL高级SQL语句

    MySQL高级SQL语句 围绕两张表 Location表 Store_Info表  #select选择  SELECT Store_Name FROM Store_Info;  #distinct去重 ...

  8. 🔥🔥TCP协议:三次握手、四次挥手,你真的了解吗?

    什么是TCP网络分层 应⽤层 应用层是网络协议栈中的最顶层,主要负责应用程序之间的通信.其中一种常见的应用层协议是HTTP协议,它定义了应用程序之间如何传递报文. 传输层 传输层是为两台主机之间的应用 ...

  9. L2-032 彩虹瓶

    #include <bits/stdc++.h> using namespace std; const int N = 1010; int main() { ios::sync_with_ ...

  10. bool数据类型用法

    1 来自百度 1.bool为布尔型用作逻辑判断 2 2.bool只有一个字节 3 3.bool取值false和true,0为false,非0为true.(例如-1和2都是true). 4 4.bool ...