D. Glider (cf 1041D)

1041 D

当周赛打就掉分系列。近几个月谨慎选择一直在上分,瞬间掉回解放前。实力还是不够啊。

利用前缀和方便地记录下从某个点开始往后,到终点气流之间的间距和。

学习low_bound的用法,复习前缀和的用法。

#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+10;
typedef long long ll;
ll dis[mx],val[mx];//dis是气流之间间距的前缀和 val是气流的前缀和
struct node
{
    int l,r;
}s[mx];
int main()
{
    int n,h;
    cin>>n>>h;
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&s[i].l,&s[i].r);
        if(i>1)
        {
            dis[i]=dis[i-1]+s[i].l-s[i-1].r;
        }
        val[i]=val[i-1]+s[i].r-s[i].l;
    }
    ll ans=0,cur;
    for(int i=1;i<=n;i++)
    {
        int pos=lower_bound(dis+1,dis+1+n,h+dis[i])-dis;//h+dis[i]实则是把之前的数值减掉
        pos--;
        cur=val[pos]-val[i-1];//先找最大的气流长度
//        cout<<cur<<endl;
        ans=max(ans,cur);
    }
    ans+=h;
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xuzonghao/article/details/82749068