https://codeforces.com/contest/1834/problem/D
我想到的是我们的答案肯定是两个区间不重合的地方最大的 然后这样想的话就要for两遍 然后还想差分来着但是都挺麻烦的
这个题解是真的太聪明了
就是说我们的答案肯定是在一段的区间上的某部分(前面 后面 两头)那我们直接来看让这一区间前面剩余最大的就是找l[i]最大的那一段是吧 后面剩余就是找r[i]最小的一段
然后还有一个就是剩余两头但剩余两头一定是存在一大段完整的包含了一小段 那我们直接用最长的一段减去最短的一段就完成了(我们假设他们重合嘛 没关系 因为如果没有重合我们取前端和后端的时候答案肯定更大就替代掉了 不影响的)
所以这题就变得特别简单!!!
void solve()
{
int n,m,mi=100000000000,ma=0,mal=0,mir=100000000000;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>l[i]>>r[i];
cnt[i]=r[i]-l[i]+1;
mal=max(l[i],mal);
mir=min(mir,r[i]);
ma=max(cnt[i],ma);
mi=min(cnt[i],mi);
}
int sum=ma-mi;//取两头
for(int i=1;i<=n;i++)
{
sum=max(sum,min(max(mal-l[i],r[i]-mir),cnt[i]));
}
cout<<sum*2<<endl;
}