CF1834D Survey in Class

 

/*
极差是 两个数的最大值
1.>>>>> <><><><> <<<<<<   / <<<<<<< <><><><><> >>>>>>   2*(max(L1,L2)-com_lenth) 
2.>>>> <><><> >>>>>>  2*|L1-L2|
3.>>>>>>>>  <<<<<<<<<  2*|L1-L2|
只有三种情况 
O(n^2) 对于每一个 区间 枚举n个 按照三种情况判断 取最大值
显然超出范围 n,m<=1e5 T<=1e4
考虑 O(n) 或者 O(n*logn) 

优化:
1/贪心:
(1)对于每一个区间 从前往后扫 只要 com_length 尽量小就可以了 ->maxl +minr
(2) |L1-L2| 记录最小值即可 -> minlen

因为有可能不重叠 所以 max(  ,0) 
ans = max(ans, a[i].r - a[i].l + 1 -
        min(max(a[i].r - maxl + 1, 0), min(max(minr - a[i].l + 1, 0), minlen)));
        
*/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
//#include<queue>
//#include<vector>
//#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
typedef pair<int,int> pii;
const int N = 114514;
#define l first
#define r second
pii a[N];

int main()
{
    int T, n, m;
    cin >> T;
    while(T--){
        cin >> n >> m;
        for(int i = 1; i <= n; i++)
            cin >> a[i].l >> a[i].r;
        int maxl = 0, minr = 2e9, minlen = 2e9;
        for(int i = 1; i <= n; i++)
            maxl = max(maxl, a[i].l), minr = min(minr, a[i].r),
            minlen = min(minlen, a[i].r - a[i].l + 1);
        int ans = 0;
        for(int i = 1; i <= n; i++)
            ans = max(ans, a[i].r - a[i].l + 1 -
                    min(max(a[i].r - maxl + 1, 0), min(max(minr - a[i].l + 1, 0), minlen)));
        cout << ans * 2 << endl;
    }
    return 0;
}

 

posted @ 2023-10-05 16:19  JMXZ  阅读(8)  评论(0)    收藏  举报