/*
区间
有n个区间,这n个区间内的天数,都签到了,m表示m张补签卡
区间可能存在交叉的情况,求最多连续签到多少天
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
int n,m;
const int maxn=1e5+5;
LL sum[maxn];
struct node
{
int l;
int r;
} cnt[maxn];
bool cmp(node a,node b)
{
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0; i<n; i++)
{
scanf("%d %d",&cnt[i].l,&cnt[i].r);
}
sort(cnt,cnt+n,cmp);
int k=0;
for(int i=1; i<n; i++)//合并有交集的区间
{
if(cnt[i].l<=cnt[k].r+1)
{
cnt[k].r=max(cnt[k].r,cnt[i].r);
}
else
{
cnt[++k].l=cnt[i].l;
cnt[k].r=cnt[i].r;
}
}
for(int i=1; i<=k; i++)//预处理区间差值的前缀和
{
sum[i]=sum[i-1]+cnt[i].l-cnt[i-1].r-1;
}
int j=0;
LL ans=0;
for(int i=0; i<=k; i++)
{
while(j+1<=k&&sum[j+1]-sum[i]<=m)//遍历每个可以尽可能补签的位置
j++;
ans=max(ans,cnt[j].r-cnt[i].l+1+m-(sum[j]-sum[i]));
//(末区间右边-首区间左边)+(m-需要补签的天数)
}
printf("%I64d\n",ans);
}
return 0;
}
HDU6119 小小粉丝度度熊(区间)
最新推荐文章于 2017-08-19 09:33:26 发布