一、前言

  最开始卡这题是某大佬给出的树DP专题中的一个,据说类似于对抗搜索(这是啥?)的一题

  但是在经历了若干艰难困苦之后发现这题在HDU上A不了——(先卡vector的时间,后卡输入的时间,上了输入挂还是玄学超时)。于是遵从百度到的大佬指点,上UVA上面交了一发,发现500毫秒过得。。。感觉心好累。。。。

二、题意

  A,B两人计划在一棵树上旅行,A想尽量短,B想尽量长,但是有个区间规定了这个时间长短:L和R。考虑到是B开始出发,于是求能够在L-R区间内得到的最远的距离。如果得不到就输出“Oh, my god!”

  思路大概是,设DP【i】为第i号节点的最优解——(不论是对A还是B来说的最优解)。能这么干是因为,树的形状、起始节点一旦给定就会使得每个节点由射来选择成为一个固定选项。因而可以直接这么设定。于是,剩下的比较简单——A在区间内选最小,B在区间内选最大。

#include<stdio.h>
#include<string.h>
using namespace std;
#define ll int
#define pp pair<int,ll>
#define vecp vector<pp> const long long MAXN=; //vecp G[MAXN]; inline void read_int(int &ret)
{
ret=;
char c=getchar();
while(c>''||c<'')c=getchar();
while(c<=''&&c>='')ret=ret*+c-'',c=getchar();
} class node
{
public:
int next;
int to;
ll cost;
void make(int next,int a,ll b)
{
this->next=next;
to=a;
cost=b;
} };node G[MAXN*];
int number[MAXN];
int size;int cnt[MAXN];
void add(int a,int b,ll c)
{
// number[a]=size;
cnt[a]++;
G[size].make(number[a],b,c);
number[a]=size++;
} ll dp[MAXN];
ll n,l,r; inline bool check(ll tmp)
{
return tmp>=l&&tmp<=r;
} void checkMin(ll &a,ll b)
{
a= a==-||a>b ? b:a;
}
void checkMax(ll &a,ll b)
{
a= a==-||a<b ? b:a;
} void dfs(int now,int last,ll maxx,bool isBob)
{
// int len=G[now].size(); dp[now]=-;
for(int i=number[now];i!=-;i=G[i].next)
// for(int i=0;i<len;++i)
{
int tar=G[i].to;
// int tar=G[now][i].first;
if(tar==last)continue;
// ll cost=G[now][i].second;
ll cost=G[i].cost;
dfs(tar,now,maxx+cost,!isBob);
if(dp[tar]==-)continue;
ll summ=maxx+cost+dp[tar];
if(!check(summ))continue;
if(isBob)checkMax(dp[now],dp[tar]+cost);
else checkMin(dp[now],dp[tar]+cost);
}
if(cnt[now]==&&dp[now]==-)dp[now]=;
// if(len==1&&dp[now]==-1)dp[now]=0;
} void init()
{
memset(number,-,*(n+));
memset(cnt,,*(n+));
size=;
for(int i=;i<n;++i)
{
ll a,b,c;
read_int(a);
read_int(b);
read_int(c);
// scanf("%d%d%d",&a,&b,&c);
// cin>>a>>b>>c;
// G[a].push_back(make_pair(b,c));
// G[b].push_back(make_pair(a,c)); add(a,b,c);
add(b,a,c);
}
dfs(,-,,);
if(dp[]!=-)printf("%d\n",dp[]);
// cout<<dp[0]<<"\n";
else puts("Oh, my god!");
} int main()
{
// cin.sync_with_stdio(false);
while(scanf("%d%d%d",&n,&l,&r)!=EOF&&n&&l&&r)init(); return ;
}

UVA1484 Alice and Bob's Trip (hdu3660)的更多相关文章

  1. hdu 3660 Alice and Bob's Trip(树形DP)

    Alice and Bob's Trip Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 3660 Alice and Bob's Trip

    树形dp,这道题如果选G++的话,只输入都会超时.我是C++ 1900ms + 飘过的...但是输入优化后就快了很多了,1100ms左右.dfs按层次求最值就行了,差不多也算是博弈吧,到bob取的时候 ...

  3. 【HDOJ】3660 Alice and Bob's Trip

    就是一个基本的dfs.可关键问题是c/c++/g++光输入就超时了.还是写java过的,毕竟时限4s.都放弃希望了,没想到还真过了. import java.lang.*; import java.i ...

  4. UVA 1484 - Alice and Bob&#39;s Trip(树形DP)

    题目链接:1484 - Alice and Bob's Trip 题意:BOB和ALICE这对狗男女在一颗树上走,BOB先走,BOB要尽量使得总路径权和大,ALICE要小,可是有个条件,就是路径权值总 ...

  5. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  7. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  8. sdutoj 2608 Alice and Bob

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2608 Alice and Bob Time L ...

  9. hdu 4268 Alice and Bob

    Alice and Bob Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

随机推荐

  1. HTML <pre> 标签

    需求 错落有致的规则说明 ps.我真的是一个后端开发... pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体.

  2. java8 api简介(一)

    from https://www.aliyun.com/jiaocheng/785076.html 摘要:函数式编程详解:前言:现在有很多公司都用了jdk8,但是函数式编程也许没有用上,jdk8也提供 ...

  3. echarts的title和legend重合解决(各种小细节)

    一:关于title与legend重叠 1.重合样子 2.解决办法: legend:{ show: true, top:"6%",//与上方的距离 可百分比% 可像素px }, 3. ...

  4. Selenium常见元素定位方法和操作的学习介绍

    参考地址: https://www.cnblogs.com/eastmount/p/4810690.html 这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操 ...

  5. SqlServer Alwayson 搭建排错记录(一)

    这几天搭建alwayson,碰到一堆问题,解决起来花了不少时间,特此记下几个有代表性的,以免以后再碰到做重复功. 一.创建可用性组 使用SSMS的创建可用性组向导,添加了一个主副本node1,一个辅助 ...

  6. k8s之configmap配置中心

    记录在石墨笔记中,懒得再粘贴了,大家直接移步下面地址 https://shimo.im/docs/ktNM72QPweEEkcWg/

  7. NopCommerce 3.80框架研究(二) MVC 表示层与数据验证

    表示层框架结构 /Views/Shared/_Root.Head.cshtml /Views/Shared/_Root.cshtml /Views/Shared/_ColumnsOne.cshtml ...

  8. UVA 215 Spreadsheet Calculator (模拟)

    模拟题.每个单元格有表达式就dfs,如果有环那么就不能解析,可能会重复访问到不能解析的单元格,丢set里或者数组判下重复. 这种题首先框架要对,变量名不要取的太乱,细节比较多,知道的库函数越多越容易写 ...

  9. iptables 防火墙详解

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

  10. 2018.5.28 Oracle数据库补充

    select * from (select rownum rn,e2.* from (select e1.* from emp e1)e2 where rownum<=10)e3 where e ...