906. 区间分组
题目链接https://www.acwing.com/problem/content/908/
题目:
解法一:按左区间升序排序,然后用小根堆来存储当前各区间最小的右边值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<utility>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int ,int>PII;
PII p[100010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d%d",&p[i].first,&p[i].second);
}
sort(p,p+n);
int ans=0;
priority_queue<int ,vector<int> ,greater<int>> q;
for(int i=0;i<n;i++){
if(q.empty()||q.top()>=p[i].first){
q.push(p[i].second);
ans++;
}else{
q.pop();
q.push(p[i].second);
}
}
cout<<ans;
return 0;
}
解法二:这个解法很妙,将左端点变成偶数=2x,右端点变成奇数=2x+1。然后求某一时间的峰值。若有一个区间的右端点和一个区间的左端点相等,由于右端点是奇数,左端点是偶数,所以一定先遍历到左端点。这样就解决了区间端点不能相同的问题,反之,可以区间相同,就左端点变成奇数=2x+1,右端点变成偶数=2x。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[200000+10];
int main(){
cin>>n;
int x,y;
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
a[i*2]=x*2;
a[i*2+1]=y*2+1;
}
sort(a,a+2*n);
int res=0, ans=0;
for(int i=0;i<2*n;i++){
if(a[i]%2==0){
ans++;
res=max(res,ans);
}else{
ans--;
}
}
cout<<res;
return 0;
}