按左端点排其实是能够保证尽可能的将能合到一组的区间合并到一起,每次都挑最小的右端点来比较,一是能够保证如果连右端点最小的组都不能满足合并它的话那么自然就没有组可以合并它了,这个时候就有一个疑问,你把最小的右端点给更新了,那会不会对后面的区间合并造成影响呢,答案自然是不会,左端点排序的作用就显示出来了,因为是按左端点排序的,记前一个点为d1,后一个点为d2,d1.l[HTML_REMOVED]d1.l,所以d2也可以和第二组合并,所以二者是等价的,但是如果d1能和第一小右端点合并而不能和第二小右端点合并时,如果你不按右端点排序而强行和第一小的合并,会漏掉一个可以合并到一组的一种情况,可以看一下下面的图解
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct rag{
int l;
int r;
bool operator < (const rag & w){
return l < w.l;
}
}rags[N];
int n;
int main(){
cin>>n;
for(int i = 0;i<n;i++){
int l,r;
cin>>l>>r;
rags[i] = {l,r};
}
sort(rags,rags+n);
priority_queue<int ,vector<int>,greater<int>> q;//每次都放到maxr最小的组里面,如果冲突则说明没有组能够容下它
for(int i = 0;i<n;i++){
auto r = rags[i];
if(q.empty()||q.top()>=r.l) q.push(r.r);
else {
q.pop();
q.push(r.r);
}
}
cout<<q.size();
return 0;
}