B - Glider Gym - 101911B
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
using namespace std;
struct node
{
int l, r ;
} x[200005];
int a[200005], b[200005] ;
int main()
{
int n, m ;
cin >> n>> m;
for(int i = 1; i<=n; i++)
{
cin >> x[i].l >>x[i].r;
}
a[1] = x[1].r-x[1].l ;
b[1] = 0;
for(int i = 2; i<=n; i++)
{
a[i] = a[i-1] + x[i].r - x[i].l ;
b[i] = b[i-1] + x[i].l - x[i-1].r;
}
int maxx = -1;
b[n+1] = 0x3f3f3f3f ;
for(int i =1; i<=n; i++)
{
int pos = lower_bound(b+1,b+n+1,b[i]+m)-b ;//返回第一个大于等于吧b[i]+m的数等价于我每次找间隙,因为b[i]在变大
//所以就相当于从第几个汽留开始
maxx = max(maxx,a[pos-1]-a[i-1]);//b[i]是递增的所以就相当于一直往后找
}
printf("%d\n",maxx+m);
return 0;
}