题解:
显然,每当进入一个小的边界,那么我们的ans+1,出去一个大的边界,ans-1
然后,我们将每一个边界排序,时间小的在前,大的在后
每一次进来一个,如果是左边的边界,+1,右边的-1
然后输出过程中最大的值
对于左右边界重合,默认左边界在前(也可以右边界+1,然后右边界在前)
代码:
#include<bits/stdc++.h> using namespace std; const int N=200005; int n,a[N],f[N],b[N]; int cmp(int x,int y) { return a[x]<a[y]||(a[x]==a[y]&&b[x]<b[y]); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d",&a[i],&a[i+n]); a[i+n]++;b[i]=1;b[i+n]=-1; } for (int i=1;i<=2*n;i++)f[i]=i; sort(f+1,f+n+n+1,cmp); int ans=0,num=0; for (int i=1;i<=2*n;i++) { num+=b[f[i]]; ans=max(ans,num); } printf("%d\n",ans); }