D. Glider (cf 1041D)
阿新 • • 發佈:2018-12-10
當週賽打就掉分系列。近幾個月謹慎選擇一直在上分,瞬間掉回解放前。實力還是不夠啊。
利用字首和方便地記錄下從某個點開始往後,到終點氣流之間的間距和。
學習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; }