一、前言

  最开始卡这题是某大佬给出的树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. ASP编码规范

    ASP编码规范(--::) 第一章 ASP编码规范通述 ASP编码分为两大部分,一部分为静态文件编码,一部分为包含服务器端脚本的动态文件编码. 静态文件编码分script编码和HTML编码两部分. 服 ...

  2. over partition by与group by

    over partition by与group by 的区别 http://www.cnblogs.com/scottpei/archive/2012/02/16/2353718.html 今天看到一 ...

  3. js统计字符出现次数

    var s = "The rain in Spain falls rain mainly in the rain plain"; var reg = new RegExp(&quo ...

  4. iOS开发ReactiveCocoa学习笔记(一)

    学习 RAC 我们首先要了解 RAC 都有哪些类 RACSignal RACSubject RACSequence RACMulticastConnection RACCommand 在学习的时候写了 ...

  5. 使用Kubernetes的java-client实现Deployment的部署及更新操作

    1. 背景介绍 需求: 针对多种协议SDK构造探针,测试公司接入机服务状况(每一个探针应对单一接入机,接入机数量可能会动态变化). 难点: 大多数协议SDK均不支持多实例运行,且部分SDK通过生成文件 ...

  6. Diary

    2019.1.16 233333333 2018.12.5 猜猜我写了什么? 2018.12.3 maya真是越来粤菜了.. 突然发现cf其实有中文 2018.12.1 说好的今天出成绩呢?.. 咕咕 ...

  7. Javascript Events

    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. 事件句柄 html4.0的新特性之一是有能力使html事件触发浏览器中的动作action,比如当用户点击某个html元素时启动一段Ja ...

  8. 原生js添加类名,删除类名

    1.添加类名: document.getElementById("myDiv").classList.add('mystyle'); 2.删除类名: document.getEle ...

  9. PIC IDE编译器变量问题

    1.用const关键字是不能把变量定义到ROM区域的,在IDE编译器里要在变量的定义前面加入rom关键字.例如: rom char tmp[257]={0};const rom char tmp[25 ...

  10. CentOS-7系统安装配置

    CentOS 7 系统安装配置 服务器相关设置如下: 操作系统:CentOS 7.3.1611 IP地址:192.168.3.30 网关:192.168.3.1 DNS:8.8.8.8 8.8.4.4 ...