http://codeforces.com/contest/1041/problem/D
先合并气流 得k个互不相交的气流 然后对(i-1)个空隙做前缀和 枚举以每个气流为起点的 可以飞到哪里 二分实现
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node
{
ll l;
ll r;
};
node seg[200010];
ll dis[200010],pre[200010],gou[200010];
ll h;
int n,len;
bool cmp(node n1,node n2)
{
return n1.l<n2.l;
}
int main()
{
ll ans;
int i,l,r,m,pos;
scanf("%d%lld",&n,&h);
for(i=1;i<=n;i++) scanf("%lld%lld",&seg[i].l,&seg[i].r);
sort(seg+1,seg+n+1,cmp);
len=0;
for(i=1;i<=n;i++)
{
if(len==0||seg[len].r<seg[i].l) seg[++len]=seg[i];
else seg[len].r=max(seg[len].r,seg[i].r);
}
//for(i=1;i<=len;i++) printf("%d %d\n",seg[i].l,seg[i].r);
for(i=1;i+1<=len;i++)
{
dis[i]=seg[i+1].l-seg[i].r;
pre[i]=pre[i-1]+dis[i];
}
for(i=1;i<=len;i++) gou[i]=gou[i-1]+(seg[i].r-seg[i].l);
ans=seg[len].r-seg[len].l+h;
//printf("*%lld %d*\n",ans,len);
for(i=1;i<=len-1;i++)
{
l=i,r=len-1,pos=i-1;
while(l<=r)
{
m=(l+r)/2;
if(h>pre[m]-pre[i-1]) pos=m,l=m+1;
else r=m-1;
}
//printf("*%d*\n",pos);
//printf("%lld %lld %lld\n",pre[pos]-pre[i-1],gou[pos+1]-gou[i-1],h-(pre[pos]-pre[i-1]));
ans=max(ans,pre[pos]-pre[i-1]+gou[pos+1]-gou[i-1]+(h-(pre[pos]-pre[i-1])));
}
printf("%lld\n",ans);
return 0;
}
/*
2 3
1 4
7 8
*/