codeforces round#509(div2) D. Glider
阿新 • • 發佈:2018-12-23
好難調,調了我快兩個小時,qwq
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,h; int dis[200010]; struct segment{ int x1,x2; int len; }seg[200010]; bool check(ll mid) { int last=1; int front=lower_bound(dis+1,dis+n,dis[last-1]+h)-dis;//找到字首和符合條件的第一個下標位置 ll res=h; for(int i=last;i<=front;i++) res+=seg[i].len; if(res>=mid) return true; while(front<n) { last++;//向前推進 res-=seg[last-1].len; int tmp=front; front=lower_bound(dis+1,dis+n,dis[last-1]+h)-dis;//每一次找到第一個符合要求的位置 for(int i=tmp+1;i<=front;i++)//累加front之前的數字 res+=seg[i].len; if(res>=mid) return true; } return false; } int main() { scanf("%d%d",&n,&h); for(int i=1;i<=n;i++) { int x1,x2; scanf("%d%d",&x1,&x2); seg[i].x1=x1; seg[i].x2=x2; seg[i].len=(x2-x1); } for(int i=1;i<=n-1;i++) { dis[i]=seg[i+1].x1-seg[i].x2; }//搞出字首和 for(int i=1;i<=n-1;i++) { dis[i]+=dis[i-1]; } ll l=h,r=3e9; ll best=-1; while(l<=r) { ll mid=l+(r-l)/2; if(check(mid)) { best=mid; l=mid+1; } else { r=mid-1; } } printf("%lld\n",best); }