bzoj2501

题解:

显然,每当进入一个小的边界,那么我们的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
",ans); 
}
原文地址:https://www.cnblogs.com/xuanyiming/p/8194521.html