正如讨论里说的:把线段转化成一个入点和一点出点,这样存下2*n个点,之后按坐标从小到大给这2*n个点排序,之后O(n)遍历一遍就好,遇到入点sum++, 遇到出点sum–,遍历时最大的sum便是答案,算上排序复杂度稳定nlogn(注意:排序时坐标相同的点出点优先)
#include <bits/stdc++.h>
using namespace std;
struct action
{
int time;
int flag;
};
const int MAXN = 20010;
action as[MAXN];
bool cmp(action a1, action a2)
{
return a1.time < a2.time;
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
int a,b;
for(int i = 0; i < 2*n; i += 2)
{
cin >> as[i].time;
as[i].flag = 1;
cin >> as[i+1].time;
as[i+1].flag = 0;
}
sort(as,as+2*n,cmp);
int res = 1;
int sum = 1;
for(int i = 1; i < 2*n; ++i)
{
if(as[i].flag == 0)
--sum;
else
++sum;
if(sum > res)
res = sum;
}
cout << res << endl;
return 0;
}