合并相互交叉的区间,尺取法
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 100100;
struct node
{
long long s,e;
};
node prens[MAXN], nns[MAXN];
long long n,m,cnt;
bool cmp(const node& a, const node& b)
{
return a.s < b.s;
}
int main()
{
ios::sync_with_stdio(false);
while(cin >> n >> m)
{
cnt = 0;
for(long long i = 0; i < n; ++i)
cin >> prens[i].s >> prens[i].e;
sort(prens,prens+n,cmp);
nns[cnt] = prens[0];
for(long long i = 1; i < n; ++i)
{
if(nns[cnt].e >= prens[i].s)
nns[cnt].e = max(nns[cnt].e,prens[i].e);
else
nns[++cnt] = prens[i];
}
long long l = 0;
long long r = 0;
long long t = 0;
long long res = nns[0].e-nns[0].s+1+m;
while(r < cnt)
{
while(t+nns[r+1].s-nns[r].e-1 <= m && r+1 <= cnt)
{
t += nns[r+1].s-nns[r].e-1;
++r;
}
res = max(res,nns[r].e-nns[l].s+1+m-t);
t -= nns[l+1].s-nns[l].e-1;
++l;
}
cout << res << endl;
}
return 0;
}