【bzoj4723】 [POI2017]Flappy Bird
2017-07-27 11:40
204 查看
Description
《飞扬的小鸟》是一款风靡的小游戏。在游戏中,小鸟一开始位于(0,0)处,它的目标是飞到横坐标为X的某个位置上。每一秒,你可以选择点击屏幕,那么小鸟会从(x,y)飞到(x+1,y+1),或者不点击,那么小鸟会飞到(x+1,y-1)
。在游戏中还有n个障碍物,用三元组(x[i],a[i],b[i])描述,表示在直线x=x[i]上,y<=a[i]或者y>=b[i]的部分
都是障碍物,碰到或者擦边都算游戏失败。请求出小鸟从(0,0)飞到目的地最少需要点击多少次屏幕。
Input
第一行包含两个整数n(0<=n<=500000),X(1<=n<=10^9)。接下来n行,每行三个整数x[i],a[i],b[i](0<x[i]<X,-10^9<=a[i]<b[i]<=10^9)。
数据保证x[i]<x[i+1]。
Output
如果无论如何都飞不到目的地,输出NIE,否则输出点击屏幕的最少次数。Sample Input
4 114 1 4
7 -1 2
8 -1 3
9 0 2
Sample Output
5HINT
维护每个障碍可以通过的高度的区间,答案为先飞到这个区间的最低点,然后一次向上,一次向下(保持高度不变)
#include<iostream>
#include<cstdio>
using namespace std;
int n,x[500005],l[500005],r[500005],L,R,nx;
int main (){
scanf ("%d%*d",&n);
for (int i=1;i<=n;++i)
scanf ("%d%d%d",&x[i],&l[i],&r[i]);
for (int i=1;i<=n;++i){
int tmp=x[i]-x[i-1];
L=max(L-tmp,l[i]+1);
R=min(R+tmp,r[i]-1);
if (((L&1)!=(x[i]&1)))L++;
if (((R&1)!=(x[i]&1)))R--;
if (L>R){puts("NIE");return 0;}
}
printf ("%d",L+x
>>1);
return 0;
}
相关文章推荐
- BZOJ4723 [POI2017]Flappy Bird
- BZOJ4723 [POI2017]Flappy Bird
- BZOJ4723: [POI2017]Flappy Bird
- 【BZOJ】4723 [POI2017] Flappy Bird
- BZOJ 4723: [POI2017]Flappy Bird
- BZOJ 4723 POI2017 Flappy Bird
- 【BZOJ4723】【POI2017】Flappy Bird
- 【BZOJ4723】[POI2017]Flappy Bird DP
- 【BZOJ4723】【POI2017】Sabota?
- 4723: [POI2017]Flappy Bird
- BZOJ 4723 Flappy Bird
- bzoj4723
- bzoj 4727 [POI2017]Turysta 竞赛图
- 【BZOJ4726】[POI2017]Sabota? 树形DP
- [bzoj4726][POI2017][Sabota?] (树形dp)
- BZOJ4724: [POI2017]Podzielno
- 【BZOJ4724】【POI2017】Podzielno
- BZOJ_4726_[POI2017]Sabota?_树形DP
- bzoj 4725: [POI2017]Reprezentacje ró?nicowe 暴力
- BZOJ 4726: [POI2017]Sabota?【树形dp