Glider Gym - 101911B(二分+前缀和)

没一个x降1个y 所以对于高度H 不在上升区最多走在x方向走H

a[]存上升区的前缀和

b[]存非上升区的前缀和

对于每个b[i]+h二分查找对应的点;

a[pos-1]-a[i-1]就是其经过的上升区的长度

维护最大值

ans+H 即为答案

#include<bits/stdc++.h>

#define mem(a,b) memset(a,b,sizeof(a))
#define sc(x) scanf("%lld",&(x))
#define inf 0x3f3f3f3f
#define ll long long
#define int long long

using namespace std;

const int maxn=2e5+10;

struct node{
    int l,r;
}e[maxn];

int a[maxn],b[maxn];

#undef int
int main()
{
#define int long long
    int n,h;
    sc(n),sc(h);
    e[0].r=0;
    int l,r;
    cin>>l>>r;
    e[1]=(node){l,r};
    a[1]=r-l;
    b[1]=0;
    for(int i=2;i<=n;i++)
    {
        sc(l),sc(r);
        a[i]=a[i-1]+r-l;
        b[i]=b[i-1]+l-e[i-1].r;
        e[i]=(node){l,r};
    }
    b[n+1]=inf;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int pos=lower_bound(b+1,b+1+n,b[i]+h)-b;
        ans=max(ans,a[pos-1]-a[i-1]);
    }
    cout<<ans+h<<endl;
    return 0;
}

 

posted @ 2019-08-01 14:27  Minun  阅读(139)  评论(0编辑  收藏  举报