题目:hdu6199
分析:区间合并模版 双指针
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = (int)1e5 + 10;
struct Point {
int l, r;
bool operator < (const Point &a) const {
if (l != a.l) return l < a.l;
return r < a.r;
}
}A[maxn], B[maxn];
int n, m, cnt;
int main(){
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
while (scanf("%d %d", &n, &m) == 2) {
for (int i = 1; i <= n; i ++) {
int l, r;
scanf("%d %d", &l, &r);
A[i] = (Point){l, r};
}
sort(A + 1, A + n + 1);
B[1] = A[1];
cnt = 1;
for (int i = 2; i <= n; i ++)
if (A[i].l <= B[cnt].r || A[i].l - B[cnt].r == 1)
B[cnt].r = max(B[cnt].r, A[i].r);
else B[++cnt] = A[i];
int L = 1, R, ans = 0;
for (R = 1; R <= cnt; R ++) {
if (R != 1) {
m -= B[R].l - B[R-1].r - 1;
while (m < 0) {
m += B[L+1].l - B[L].r - 1;
L ++;
}
}
ans = max(ans, B[R].r - B[L].l + 1 + m);
}
printf("%d\n", ans);
}
return 0;
}