[题解]CF1884C Medium Design
思路
假设最后最大值的位置为 ,最小值的位置为 。
那么将所有满足 的线段选出来一定不优。
因为如果 会使答案减 ;如果 会使答案不变。
考虑 的移动对答案的影响。
如果 ,那么 右移一定不会使答案变劣;反之,如果 ,那么 左移一定不会使答案变劣。
所以最后 的取值一定会是 或 。
将两种情况分别计算一下即可。对于计算的时候由于是静态的问题,可以直接先离散化,然后套一个差分即可。
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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】