题目连接:这里写链接内容
思路:这题题意很迷,也需要一定的脑洞,就是最多问几次使得问的人能确定是否存在一个整数点能被所有的线段覆盖,我们拼命分析,冷静分析,就能发现当存在两个峰的情况是可以确定答案的,那么就是找全部上升的,或者全部下降的,或者一边全上升,一边全下降的,用nlogn求最长上升子序列的方法求即可
accode
#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+65;
int a[maxn];
int z[maxn];
int j[maxn];
int b[maxn];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 0;i<n;i++){
int l,r;
scanf("%d%d",&l,&r);
a[l]++;
a[r+1]--;
}
for(int i = 1;i<=m;i++) a[i] += a[i-1];
memset(b,0x3f,sizeof(b));
b[0] = 0;
for(int i = 1;i<=m;i++){
//cout<<a[i]<<endl;
z[i] = lower_bound(b,b+m+1,a[i]+1)-b;
b[z[i]] = min(b[z[i]],a[i]);
}
reverse(a+1,a+1+m);
memset(b,0x3f,sizeof(b));
b[0] = 0;
for(int i = 1;i<=m;i++){
j[i] = lower_bound(b,b+m+1,a[i]+1)-b;
b[j[i]] = min(b[j[i]],a[i]);
}
int ans = 0;
for(int i = 1;i<=m;i++){
ans = max(ans,z[i]+j[m-i+1]-1);
}
cout<<ans<<endl;
}