题目传送门
好久没写了,刷题的时候看到了这个经典题,就来写一下,我见过的原题叫校门外的树。题意一样,我们只要把一开始的时间的开始和结束节点排个序,然后一遍扫过去,如果是开头就sum++,如果是节点就sum–,然后中途sum的最大值就是答案了。听一些dalao说这叫做差分。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define Clear(a,x) memset(a,x,sizeof(a))
#define ll long long
#define INF 2000000000
#define eps 1e-8
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=10005;
int n,sum,ans;
struct node{
int key,id;
}a[maxn<<1];
bool cmp(node a,node b){
if (a.key==b.key) return a.id<b.id;
else return a.key<b.key;
}
int main(){
n=read();
rep(i,1,2*n){
a[i].key=read();
a[i].id=(i%2==1)?1:-1;
}
sort(a+1,a+2*n+1,cmp);
rep(i,1,2*n){
sum+=a[i].id;
ans=max(ans,sum);
}
printf("%d\n",ans);
return 0;
}