看到大家伙都没有第二种思路,我就写两个思路的题解吧,有误请指正
优先队列思路
- 从小到大对左端点排序
- 如果堆中右端点最小值>当前seg[i]的左端点,新建一组(res++),入堆
- 反之出堆,入堆新的右端点
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int,int>PII;
const int N=1e5+10;
int n;
PII seg[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++) scanf("%d%d",&seg[i].first,&seg[i].second);
sort(seg,seg+n);
priority_queue<int,vector<int>,greater<int>>q;//小根堆
q.push(seg[0].second);
int res=1;
for(int i=1;i<n;i++)
{
int t=q.top();
if(seg[i].first>t) q.pop();//出堆
else res++;
q.push(seg[i].second);
}
cout<<res<<endl;
return 0;
}
差分思路
- 对每个点设置权值1或-1
- 按左端点排序,在累加过程中取最大值即为冲突值,即分组的最小值
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int>PII;
const int N=2e5+10;
int n,cnt;
PII seg[N];
bool cmp(PII x,PII y)
{
if(x.first!=y.first) return x.first<y.first;
return x.second>y.second;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
seg[cnt++]={a,1};//左端点设为1
seg[cnt++]={b,-1};//右端点为-1 差分思想,在累加过程中就能体现相同区间有多少个冲突
}
sort(seg,seg+cnt,cmp);
int res=0,sum=0;
for(int i=0;i<cnt;i++)
{
sum+=seg[i].second;//累加
res=max(res,sum);//取最大
}
cout<<res<<endl;
return 0;
}