[题解]CF1884C Medium Design

思路

假设最后最大值的位置为 x,最小值的位置为 y

那么将所有满足 liyri 的线段选出来一定不优。

因为如果 x<lix>ri 会使答案减 1;如果 lixri 会使答案不变。

考虑 y 的移动对答案的影响。

如果 x<y,那么 y 右移一定不会使答案变劣;反之,如果 x>y,那么 y 左移一定不会使答案变劣。

所以最后 y 的取值一定会是 1m

将两种情况分别计算一下即可。对于计算的时候由于是静态的问题,可以直接先离散化,然后套一个差分即可。

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 2e5 + 10;  
int T,n,m;  
int arr[N];  
  
struct sec{  
    int l,r;  
}s[N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 3) + (r << 1) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
inline void solve(){  
    int ans = 0;  
    vector<int> p;  
    n = read();  
    m = read();  
    for (re int i = 1;i <= n;i++){  
        s[i].l = read();  
        s[i].r = read();  
        p.push_back(s[i].l);  
        p.push_back(s[i].r + 1);  
    }  
    sort(p.begin(),p.end());  
    unique(p.begin(),p.end());  
    for (re int i = 1;i <= 2 * n;i++) arr[i] = 0;  
    for (re int i = 1;i <= n;i++){  
        if (s[i].l > 1){  
            int l = lower_bound(p.begin(),p.end(),s[i].l) - p.begin() + 1;  
            int r = lower_bound(p.begin(),p.end(),s[i].r + 1) - p.begin() + 1;  
            arr[l]++;  
            arr[r]--;  
        }  
    }  
    for (re int i = 1;i <= 2 * n;i++){  
        arr[i] += arr[i - 1];  
        ans = max(ans,arr[i]);  
    }  
    for (re int i = 1;i <= 2 * n;i++) arr[i] = 0;  
    for (re int i = 1;i <= n;i++){  
        if (s[i].r < m){  
            int l = lower_bound(p.begin(),p.end(),s[i].l) - p.begin() + 1;  
            int r = lower_bound(p.begin(),p.end(),s[i].r + 1) - p.begin() + 1;  
            arr[l]++;  
            arr[r]--;  
        }  
    }  
    for (re int i = 1;i <= 2 * n;i++){  
        arr[i] += arr[i - 1];  
        ans = max(ans,arr[i]);  
    }  
    printf("%d\n",ans);  
}  
  
int main(){  
    T = read();  
    while (T--) solve();  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18266724

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示