Gym - 101911B Glider(前缀和+二分)
传送门:点我
A plane is flying at a constant height of hh meters above the ground surface. Let's consider that it is flying from the point (−10^9,h)(−10^9,h) to the point (10^9,h)(10^9,h) parallel with Ox axis.
A glider is inside the plane, ready to start his flight at any moment (for the sake of simplicity let's consider that he may start only when the plane's coordinates are integers). After jumping from the plane, he will fly in the same direction as the plane, parallel to Ox axis, covering a unit of distance every second. Naturally, he will also descend; thus his second coordinate will decrease by one unit every second.
There are ascending air flows on certain segments, each such segment is characterized by two numbers x1 x1 and x2 x2 (x1<x2x1<x2) representing its endpoints. No two segments share any common points. When the glider is inside one of such segments, he doesn't descend, so his second coordinate stays the same each second. The glider still flies along Ox axis, covering one unit of distance every second.
If the glider jumps out at 11, he will stop at 1010. Otherwise, if he jumps out at 22, he will stop at 1212.
Determine the maximum distance along OxOx axis from the point where the glider's flight starts to the point where his flight ends if the glider can choose any integer coordinate to jump from the plane and start his flight. After touching the ground the glider stops altogether, so he cannot glide through an ascending airflow segment if his second coordinate is 00.
Input
The first line contains two integers nn and hh (1≤n≤2⋅10^5,1≤h≤10^9)(1≤n≤2⋅10^5,1≤h≤10^9) — the number of ascending air flow segments and the altitude at which the plane is flying, respectively.
Each of the next nn lines contains two integers xi1xi1 and xi2xi2 (1≤xi1<xi2≤10^9)(1≤xi1<xi2≤10^9) — the endpoints of the ii-th ascending air flow segment. No two segments intersect, and they are given in ascending order.
Output
Print one integer — the maximum distance along OxOx axis that the glider can fly from the point where he jumps off the plane to the point where he lands if he can start his flight at any integer coordinate.
Examples
3 4
2 5
7 9
10 11
10
5 10
5 7
11 12
16 20
25 26
30 33
18
1 1000000000
1 1000000000
1999999999 NOTE
In the first example if the glider can jump out at (2,4), then the landing point is (12,0), so the distance is 12−2=10
In the second example the glider can fly from (16,10) to (34,0), and the distance is 34−16=18
In the third example the glider can fly from (−100,1000000000) to (1999999899,0), so the distance is 1999999899−(−100)=1999999999
大概题意:
给出的是n个气流带(按顺序给出),和你现在所在的高度m。在气流带中不会下降,即维持进入气流带的高度。不在气流带则会每次下降一个单位。
下面n行是气流带的起点和终点。注意如果高度为0,恰好到下一个气流带的起点,也不能经过下一个加速带。
询问的是,起点的x值可以任你选择,最后降落下来到地面的点,离你选择起点的最远距离是多少。
因为是可以任意选起点,所以会有一个最大值。题目插图画的就是样例1的示例。
思路:看到题目给2秒,大暴力二分找✔。算了下复杂度是O(NlogN),n是2e5,也可以接受。
首先,要明确的一点是,起点肯定是某个加速带的起点,因为这样才能保证有更多的空间,留给后面经过更多的加速带(简单的贪心)
其次,既然是二分,那么肯定要是有序的,在这题我二分的是从我选定的起点,最远到能到的终点,中间可以经过多少加速带。因为距离是递增的,所以可以二分。
即,把每个加速带中间的间隔,抽取出来作为一个数组,对这个数组进行二分,然后同时维护一个本身加速带的长度的一个前缀和,用来快速计算,经过加速带的距离。
最后答案肯定是 :能经过的加速带的距离+m 这个值的最大值
不知道还有没有更好的办法呀,还想学习一下。
暂时先这样子吧。
最后是代码:
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
struct note{
int x,y;
}p[];
int a[];
int main()
{
vector<int>v;
int sum = ,cnt = ,n,m;
a[cnt++] = ;//a数组维护加速带的前缀和
scanf("%d %d",&n,&m);
for(int i = ; i < n ; i ++){
scanf("%d %d",&p[i].x,&p[i].y);
a[cnt] = a[cnt-] + p[i].y - p[i].x;
cnt++;
if(i > ){
sum += p[i].x-p[i-].y;
v.push_back(sum);
}//v向量用来保存加速带的前缀和
}
int ans = ;
for(int i = ;i <= v.size(); i++){
int pos = lower_bound(v.begin(),v.end(),(i==?:v[i-])+m)-v.begin();
sum = a[pos+]-a[i] + m;//加速带的长度+m ,即要更新的答案
ans = max(sum,ans);
}
printf("%d\n",ans);
}
/*
3 4
2 5
7 9
10 11 5 10
5 7
11 12
16 20
25 26
30 33 1 1000000000
1 1000000000
*/
Gym - 101911B Glider(前缀和+二分)的更多相关文章
- Glider(前缀和+二分)
题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...
- Acwing:102. 最佳牛围栏(前缀和 + 二分)
农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最 ...
- Codeforces 975 前缀和二分算存活人数 思维离直线速度相同判平行
A /* Huyyt */ #include <bits/stdc++.h> using namespace std; typedef long long ll; ]; ]; map< ...
- Codeforces 948 数论推导 融雪前缀和二分check 01字典树带删除
A. 全部空的放狗 B. 先O(NLOGNLOGN)处理出一个合数质因数中最大的质数是多少 因为p1 x1 x2的关系是 x2是p在x1之上的最小倍数 所以x1的范围是[x2-p+1,x2-1]要使最 ...
- B - Glider Gym - 101911B(二分)
output standard output A plane is flying at a constant height of hh meters above the ground surface. ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Educational Codeforces Round 11 C. Hard Process 前缀和+二分
题目链接: http://codeforces.com/contest/660/problem/C 题意: 将最多k个0变成1,使得连续的1的个数最大 题解: 二分连续的1的个数x.用前缀和判断区间[ ...
- D. Frets On Fire 前缀和+二分
这个题真的难了我一天了,这种方法一开始没想出来,后来看了题解后明白了大致思路开始自己做但是!!!但是自己实现的时候老是一些细节出错!!!,调bug调了得有一个小时,蠢死了,这道题我一定要好好总结,总结 ...
- P1314 聪明的质监员(前缀和+二分)
P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...
随机推荐
- 机器学习进阶-图像基本操作-边界补全操作 1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 进行边界的补零操作 2.cv2.BORDER_REPLICATE(边界补零复制操作)...
1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 参数说明: i ...
- 07-border(边框)
边框 边框有三个要素: 粗细.线性样式.颜色 border: solid 如果颜色不写,默认是黑色. 如果粗细不写,不显示边框. 如果只写线性样式,默认的有上下左右 3px的宽度,实体样式,并且黑色的 ...
- javascript:FileReader对象(读取文件)
FileReader对象 1.检测浏览器对FileReader的支持 1 if(window.FileReader) { 2 var fr = new FileReader(); 3 // add y ...
- unity admob
插件地址:https://github.com/unity-plugins/Unity-Admob 2017.04.11测试使用发现GoogleMobileAds.framework有问题,导致出现U ...
- 趣味编程:静夜思(Python版)
from itertools import groupby def verticalWriting(txt, offset): l = lambda x: x[0] % offset for (_, ...
- ReactiveX 学习笔记(3)转换数据流
Transforming Observables 本文的主题为转换 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(二)Transform ...
- ping ip多进程处理小程序
最近,环境维护需要经常需要判断某些服务器上的IP是否可达,由于服务器数量较多,逐一手工ping检查太过繁琐.写个小程序使用. 实现和说明 1.使用配置文件ip.txt实现可配置指定ip列表. 2.利用 ...
- 在JSP页面中导入jstl标签库
1 在工程中引用JSTL的两个jar包和标签库描述文件. (1)在项目上右击,从弹出的快捷键菜单中选择Properties命令,在出现的项目属性对话框上,选择DeploymentAssembly. ( ...
- [Shell]一张图知道Shell(图)
- PageRank算法和谷歌搜索讲解
PageRank算法和谷歌搜索讲解 吴裕雄 PageRank算法实际上就是Google使用它来计算每个网页价值的算法. Google每次的搜索结果都有成百上千万甚至上亿个相关的查询网页链接.如果将所有 ...