小小粉丝度度熊
Accepts: 1075
Submissions: 5191
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
①将所有时间段按L排序,如果L相同,按R排序(从小到大)
②遍历并合并时间段,例如[1, 5], [6,12], [8,13], [15,23]可合并为[1,13], [15, 23]
③肯定是补签连续的空档,用尺取就轻松搞定了
④注意L, R可以等于0,后面改题了
#include<stdio.h>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct Res
{
LL x;
LL y;
bool operator < (const Res &b) const
{
if(x<b.x || x==b.x && y<b.y)
return 1;
return 0;
}
}Res;
Res s[100005];
int main(void)
{
LL n, m, i, ans, cnt, last, sum, p, q;
while(scanf("%I64d%I64d", &n, &m)!=EOF)
{
cnt = 0;
for(i=1;i<=n;i++)
scanf("%I64d%I64d", &s[i].x, &s[i].y);
sort(s+1, s+n+1);
last = 0;
for(i=1;i<=n;i++)
{
if(i==1 || s[i].x>last+1)
{
s[cnt].y = last;
s[++cnt].x = s[i].x;
last = s[i].y;
}
else
last = max(s[i].y, last);
}
s[cnt].y = last;
s[cnt+1].x = s[cnt].y+m+2;
ans = m;
sum = 0;
p = q = 1;
while(q<=cnt)
{
while(sum+s[q+1].x-s[q].y-1<=m && q<=cnt)
sum += s[q+1].x-s[q].y-1, q++;
ans = max(ans, s[q].y-s[p].x+1+m-sum);
while(sum+s[q+1].x-s[q].y-1>m && q<=cnt && p<q)
sum -= s[p+1].x-s[p].y-1, p++;
if(sum+s[q+1].x-s[q].y-1>m && q<=cnt)
p++, q++;
}
printf("%I64d\n", ans);
}
return 0;
}
/*
5 2
1 8
12 15
17 19
22 25
28 33
*/