codeforces round#509(div2) D. Glider
Posted lishengkangshidatiancai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces round#509(div2) D. Glider相关的知识,希望对你有一定的参考价值。
好难调,调了我快两个小时,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 ",best); }
以上是关于codeforces round#509(div2) D. Glider的主要内容,如果未能解决你的问题,请参考以下文章