bzoj 4723 [POI2017]Flappy Bird 模拟

[POI2017]Flappy Bird

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 482  Solved: 196
[Submit][Status][Discuss]

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 11
4 1 4
7 -1 2
8 -1 3
9 0 2

Sample Output

5

HINT

 


 

 

Source

鸣谢Claris上传

 

题解:发现小鸟的运动范围是知道的,然后记录一下范围,到达一个点,的点击次数是确定的

然后如果当前的范围没有了,说明不可以通过了。

 

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<map>
 7 #include<map>
 8 
 9 #define M 500500
10 using namespace std;
11 inline int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
15     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
16     return x*f;
17 }
18 
19 int n,X,ans;
20 struct abcd{
21     int x,a,b,limit;
22     void Input()
23     {
24         scanf("%d%d%d",&x,&a,&b);
25         a++;b--;
26         limit = a-x;
27         if(limit&1) ++limit;
28     }
29 }a[M];
30 
31 int main()
32 {
33     n=read(),X=read();
34     for(int i=1;i<=n;i++)
35         a[i].Input();
36     for(int i=n-1;i>0;i--)
37         a[i].limit = max(a[i].limit , a[i+1].limit);
38     int x=0,y=0;
39     for(int i=1;i<=n;i++)
40     {
41         int temp=(y-x)-a[i].limit>>1;
42         if(temp<0) temp=0;
43         temp=a[i].x-x-temp;
44         if(temp<0) temp=0;
45         y+=temp;y-=a[i].x-x-temp;
46         x=a[i].x;
47         if(y<a[i].a || y>a[i].b)
48             return cout<<"NIE"<<endl,0;
49         ans+=temp;
50     }
51     printf("%d\n",ans);
52 }

 

posted @ 2018-04-09 14:07  Kaiser-  阅读(269)  评论(0编辑  收藏  举报