1. 程式人生 > >D. Glider (cf 1041D)

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;
}