标签:cpp pre class += 要求 scan last 前缀 div
好难调,调了我快两个小时,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);
}
codeforces round#509(div2) D. Glider
标签:cpp pre class += 要求 scan last 前缀 div
原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10163911.html