AcWing 803. 区间合并
原题链接
简单
作者:
仅存老实人
,
2020-06-16 22:16:40
,
所有人可见
,
阅读 397
习惯用矩阵表示的区间和并算法
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n;
cin >> n;
vector<vector<int> > q(n,vector<int>(2,0)),res;
for(int i=0;i<n;i++){
cin >> q[i][0] >> q[i][1];
}
sort(q.begin(),q.end());//对q按左区间排序
res.push_back({q[0][0],q[0][1]});
for(int i=1;i<n;i++){
if (q[i][0]>res.back()[1])//当前区间左边界大于前面的所有区间的右边界,即q[i][0]比res的最后一个的右区间的右边还大,res新开一个区间 [1,4] [5,6] 5>4 新开一个[5,6]
res.push_back({q[i][0],q[i][1]});
else if (q[i][1]>res.back()[1])//当前区间左边界小于等于前面的所有区间的右边界,那么只有在当前区间的右边界比前面所有区间的右边界大的时候我们才需要更新右边界。即q[i][0]<=res的最后一个的右边界 且 q[i][1]>res的最后一个的右边界时 res的右边界更新为q[i][1] [1,2] [2,4] -> [1,4]
res.back()[1] = q[i][1];
}
cout << res.size();
return 0;
}