码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces round#509(div2) D. Glider

时间:2018-12-23 13:47:18      阅读:99      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!