1. 程式人生 > >codeforces round#509(div2) D. Glider

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\n",best);
}