线段树+SPFA最短路可以过。或者DP也能过。
需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa。
1. spfa建图增加一倍的点即可(讨论左端点和右端点)。

 /* 2155 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct {
int v, w, nxt;
} edge_t; typedef struct node_t {
int xl, xr, y; node_t() {}
node_t(int xl, int xr, int y):
xl(xl), xr(xr), y(y) {} friend bool operator <(const node_t& a, const node_t& b) {
return a.y < b.y;
} } node_t; const int maxv = ;
const int maxe = maxv * ;
const int INF = 0x3f3f3f3f;
int n, x, y, mx, T;
edge_t E[maxe];
int head[maxv<<];
bool visit[maxv<<];
int dis[maxv<<];
node_t nd[maxv];
int l = , m;
int start, End;
int ID[maxv<<];
int L, R, id; void init() {
l = ;
m = ;
memset(head, -, sizeof(head));
} void addEdge(int u, int v, int w) {
E[l].v = v;
E[l].w = w;
E[l].nxt = head[u];
head[u] = l++;
} void Build(int l, int r, int rt) {
ID[rt] = ;
if (l == r)
return ; int mid = (l + r) >> ;
Build(lson);
Build(rson);
} inline void PushDown(int rt) {
if (ID[rt]) {
ID[rt<<] = ID[rt<<|] = ID[rt];
ID[rt] = ;
}
} void Update(int l, int r, int rt) {
if (L<=l && R>=r) {
ID[rt] = id;
return ;
} PushDown(rt);
int mid = (l + r) >> ; if (R <= mid) {
Update(lson);
} else if (L > mid) {
Update(rson);
} else {
Update(lson);
Update(rson);
}
} int Query(int k, int l, int r, int rt) {
if (l == r)
return ID[rt]; PushDown(rt);
int mid = (l + r) >> ; if (k <= mid)
return Query(k, lson);
else
return Query(k, rson);
} int spfa() {
queue<int> Q;
int u, v, k; memset(visit, false, sizeof(visit));
memset(dis, INF, sizeof(dis));
dis[start] = ;
visit[start] = true;
Q.push(start); while (!Q.empty()) {
u = Q.front();
Q.pop();
visit[u] = false;
for (k=head[u]; k!=-; k=E[k].nxt) {
v = E[k].v;
if (dis[u]+E[k].w < dis[v]) {
dis[v] = dis[u] + E[k].w;
if (!visit[v]) {
visit[v] = true;
Q.push(v);
}
}
}
} return dis[End];
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t;
int lid, rid;
int tmp, w; scanf("%d", &t);
rep(tt, , t+) {
scanf("%d %d %d %d %d", &n, &x, &y, &mx, &T);
++x;
init();
rep(i, , n) {
scanf("%d %d %d", &nd[m].xl, &nd[m].xr, &nd[m].y);
++nd[m].xl;
++nd[m].xr;
if (nd[m].y < y)
++m;
} nd[m].xl = x;
nd[m].xr = x;
nd[m].y = y;
++m;
nd[m].xl = ;
nd[m].xr = ;
nd[m].y = ;
sort(nd+, nd++m);
End = ;
start = m;
memset(ID, , sizeof(ID)); L = nd[].xl;
R = nd[].xr;
id = ;
Update(, , );
rep(i, , m+) { // handle left
L = nd[i].xl;
lid = Query(L, , , );
tmp = nd[i].y - nd[lid].y;
if (tmp <= mx) {
if (lid == End) {
w = tmp;
addEdge(i, lid, w);
} else {
// to left of lid
w = tmp + nd[i].xl - nd[lid].xl;
addEdge(i, lid, w); // to right of lid
w = tmp + nd[lid].xr - nd[i].xl;
addEdge(i, lid+m, w);
}
} // handle right
if (i != m) {
R = nd[i].xr;
rid = Query(R, , , );
tmp = nd[i].y - nd[rid].y;
if (tmp <= mx) {
if (rid == End) {
w = tmp;
addEdge(i+m, rid, w);
} else {
// to left of rid
w = tmp + nd[i].xr - nd[rid].xl;
addEdge(i+m, rid, w); // to right of rid
w = tmp + nd[rid].xr - nd[i].xr;
addEdge(i+m, rid+m, w);
}
}
} L = nd[i].xl;
R = nd[i].xr;
id = i; Update(, , );
} tmp = spfa();
if (tmp==INF || tmp>T)
puts("YES");
else
puts("NO");
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

2. DP, 二维DP,没什么好说的。

 /* 2155 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct node_t {
int l, r, h; node_t() {}
node_t(int l, int r, int h):
l(l), r(r), h(h) {} friend bool operator< (const node_t& a, const node_t& b) {
return a.h > b.h;
} } node_t; const int maxn = ;
const int INF = 0x3f3f3f3f;
node_t nd[maxn];
int dp[maxn][];
int n, x, y, mx, T; void solve() {
bool fl, fr;
int tmp; memset(dp, INF, sizeof(dp));
dp[][] = dp[][] = ;
rep(i, , n) {
#ifndef ONLINE_JUDGE
printf("l = %d, r = %d, [0] = %d, [1] = %d\n", nd[i].l, nd[i].r, dp[i][], dp[i][]);
#endif
fl = fr = true;
rep(j, i+, n+) {
tmp = nd[i].h - nd[j].h;
if (tmp > mx)
break;
if (fl && nd[j].l<=nd[i].l && nd[i].l<=nd[j].r) {
fl = false;
if (j == n) {
dp[j][] = min(dp[j][], dp[i][]+tmp);
dp[j][] = min(dp[j][], dp[i][]+tmp);
} else {
dp[j][] = min(dp[j][], dp[i][]+tmp+nd[i].l-nd[j].l);
dp[j][] = min(dp[j][], dp[i][]+tmp+nd[j].r-nd[i].l);
}
}
if (fr && nd[j].l<=nd[i].r && nd[i].r<=nd[j].r) {
fr = false;
if (j == n) {
dp[j][] = min(dp[j][], dp[i][]+tmp);
dp[j][] = min(dp[j][], dp[i][]+tmp);
} else {
dp[j][] = min(dp[j][], dp[i][]+tmp+nd[i].r-nd[j].l);
dp[j][] = min(dp[j][], dp[i][]+tmp+nd[j].r-nd[i].r);
}
}
}
} if (dp[n][]<=T || dp[n][]<=T)
puts("NO");
else
puts("YES");
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t; scanf("%d", &t);
while (t--) {
scanf("%d %d %d %d %d", &n, &x, &y, &mx, &T);
nd[].l = nd[].r = x;
nd[].h = y;
rep(i, , n+)
scanf("%d %d %d", &nd[i].l, &nd[i].r, &nd[i].h);
sort(nd, nd+n);
++n;
nd[n].l = ;
nd[n].r = ;
nd[n].h = ;
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】2155 小黑的镇魂曲的更多相关文章

  1. hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛

    感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...

  2. hdu2155 小黑的镇魂曲(dp)

    题意:                             小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...

  3. 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)

    题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...

  4. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. HDOJ 1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  8. hdoj 1385Minimum Transport Cost

    卧槽....最近刷的cf上有最短路,本来想拿这题复习一下.... 题意就是在输出最短路的情况下,经过每个节点会增加税收,另外要字典序输出,注意a到b和b到a的权值不同 然后就是处理字典序的问题,当松弛 ...

  9. HDOJ(2056)&HDOJ(1086)

    Rectangles    HDOJ(2056) http://acm.hdu.edu.cn/showproblem.php?pid=2056 题目描述:给2条线段,分别构成2个矩形,求2个矩形相交面 ...

随机推荐

  1. C# .NET 获取枚举值的自定义属性(特性/注释/备注)信息

    一.引言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息 比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到. pub ...

  2. spring mvc 全局异常处理

    package com.tool; public class MyException extends Exception{ public String Msg; public String ErrCo ...

  3. java新手笔记24 Math/String对象

    1.Math package com.yfs.javase; public class MathDemo { public static void main(String[] args) { int ...

  4. Codevs 1001 舒适的路线 2006年 NOIP全国联赛提高组

    1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观 ...

  5. [翻译]log4net教程

    原文:log4net Tutorial 一.基础: log4net分为三部分:配置.设置和调用.配置通常是在app.webconfig或web.config文件中:为了增加灵活性,我们也可以使用单独的 ...

  6. [翻译][MVC 5 + EF 6] 6:创建更复杂的数据模型

    原文:Creating a More Complex Data Model for an ASP.NET MVC Application 前面的教程中,我们使用的是由三个实体组成的简单的数据模型.在本 ...

  7. 通过bat命令批量删除VS查找历史记录

    有时候我们会发现我们的VS查找下拉框里面有很多之前的搜索记录,想删除但是却没有地方删除.  网上的方法都是直接找到注册表HKEY_CURRENT_USER\Software\Microsoft\Vis ...

  8. 【python】Python 3 +pycharm中文支持解决方案

    使用环境:window10 + python 3.5.1 方法:在代码前端增加代码:# -*-coding:gbk-*-

  9. 【转】iOS 9自带苹果式省电模式 依然软硬兼施

    非本人总结,转自:http://news.91.com/apple/1506/21837672.html 说好的改善和优化,iOS 9真的带来了.且不说那些经过改善的功能,iOS 9 推出的低功耗模式 ...

  10. node.js 1Million concurrent connections!

    https://github.com/ashtuchkin/node-millenium http://blog.caustik.com/2012/08/19/node-js-w1m-concurre ...