好难调,调了我快两个小时,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); }
原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10163911.html
时间: 2024-11-04 21:27:49