题意:给几个区间,和费用m。填补各个区间之间的空隙(费用不超过m),获得一个最大的区间。
思路:先预处理所给数据,得到不交叉的len个区间,尺取法找到最大区间。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 200000+10;
ll c[maxn];
struct node
{
int type;
int pos;
}arr[maxn];
struct gg
{
int l,r;
}qj[maxn];
bool cmp(node a,node b)
{
if(a.pos==b.pos)
return a.type<b.type;
return a.pos<b.pos;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i = 0;i<n;i++)
{
arr[i].type = 0;
arr[i+n].type = 1;
scanf("%d%d",&arr[i].pos,&arr[i+n].pos);
}
sort(arr,arr+n*2,cmp);
int len = 0,num = 1,spos;
spos = arr[0].pos;
for(int i = 1;i<n*2;i++)
{
if(arr[i].type==0)
{
if(num==0)
spos = arr[i].pos;
num++;
}
if(arr[i].type==1)
num--;
if(num==0)
{
qj[len].l = spos,qj[len].r = arr[i].pos;
len++;
}
}
ll ans = 0;
c[0] = 0;
for(int i = 0;i<len;i++)
{
c[i+1] = c[i]+qj[i].r-qj[i].l+1;
}
for(int i = 0,j = 0;i<len;i++)
{
while(j<len&&(qj[j].r-qj[i].l+1-c[j+1]+c[i]<=m))
{
ans = max(ans,(ll)(qj[j].r-qj[i].l+1));
j++;
}
ll tep = c[j]-c[i];
ans = max(ans,tep+m);
}
printf("%I64d\n",ans);
}
return 0;
}