【HDOJ】2155 小黑的镇魂曲
线段树+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 小黑的镇魂曲的更多相关文章
- hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛
感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...
- hdu2155 小黑的镇魂曲(dp)
题意: 小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...
- 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)
题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- HDOJ 1326. Box of Bricks 纯水题
Box of Bricks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1004 Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- hdoj 1385Minimum Transport Cost
卧槽....最近刷的cf上有最短路,本来想拿这题复习一下.... 题意就是在输出最短路的情况下,经过每个节点会增加税收,另外要字典序输出,注意a到b和b到a的权值不同 然后就是处理字典序的问题,当松弛 ...
- HDOJ(2056)&HDOJ(1086)
Rectangles HDOJ(2056) http://acm.hdu.edu.cn/showproblem.php?pid=2056 题目描述:给2条线段,分别构成2个矩形,求2个矩形相交面 ...
随机推荐
- C# 打印多页tif
注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...
- HTML招聘简历解析
使用 jsoup 对 HTML 文档进行解析和操作 Jsoup解析html简历与dom4j解析xml是一个道理:首先必须知道html的格式,不知道格式,无法解析.根据格式,再将需要的内容通过下面的方法 ...
- Windows Forms(二)
导读 1.用VS创建一个Windows Forms程序 2.分析上面的程序 3.Mediator pattern(中介者模式) 4.卡UI怎么办——BackgroundWorker组件 用VS创建一个 ...
- Kali-Linux之开启ssh服务
需求:通过putty软件ssh到Kali-Linux系统 问题:默认情况下,Kali系统的ssh服务并没有开启 操作方法: 1.编辑sshd_config文件 root@kali:~# vi /etc ...
- Javascript常见全局函数
ØdecodeURI() 解码某个编码的 URI ØencodeURI() 把字符串编码为 URI ØdecodeURIComponent() 解码一个编码的 URI 组件 ØencodeURIC ...
- 为什么Laravel是最成功的PHP框架?
Laravel 是一个有着美好前景的年轻框架,它的社区充满着活力,相关的文档和教程完整而清晰,并为快速.安全地开发现代应用程序提供了必要的功能.在近几年对PHP 框架流行度的统计中,Laravel始终 ...
- jquery点击其他地方隐藏div层的实现程序
js代码 $(document).ready(function() { //语言头部的点击事件,显示语言列表 $(".language_selected").click(funct ...
- WPF中Application.Current的使用
WPF程序对应一个Application对象,当前的Application对象可以通过Application.Current获取,通过获取到的Application对象,我们可以做以下的事情: App ...
- jcom2在win7 X86上操作Excel
浅谈Java中利用JCOM实现仿Excel编程 在JAVA中使用JCOM和JXL注意要点: (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.ja ...
- Unity3d Shader开发(三)Pass(Texturing )
纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...