传送门
前言:
你好!我是Cpt,一位大一双非本科学生,C++方向,目前备战蓝桥杯,欢迎一起学习交流~
1、题目
同类型习题 759. 格子染色 - AcWing题库
2、思路
①按区间将左端点就行排序
②判断区间
其中有三种情况 : 第一种 包含在内 ; 第二种 也是包含但是末端比原区间长
第三种 不包含 且first>end
3、AC代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
void merge (vector<PII> &segs){
vector<PII> res;
//先排序
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;
//设置区间为[-2e9,-2e9]的目的
//是初始化区间,还有就是防止传入的vector[HTML_REMOVED] &segs 为空区间。
for (auto seg:segs)
if (ed<seg.first){
if (st!=-2e9 )res.push_back({st, ed});
//如果前后没有if(st != -2e9)的判断,输入数据为空区间时,会把(-2e9, -2e9) 插入res的
st = seg.first, ed = seg.second;
}
else
ed = max(ed, seg.second);
//把最后一个区间存入 判断同上
if (st!=-2e9) res.push_back({st, ed});
segs =res;
}
int main () {
int n;
cin >> n;
vector<PII> segs;
for (int i = 0; i < n;i++) {
int l, r;
scanf("%d%d", &l, &r);
segs.push_back({l, r});
}
merge(segs);//区间合并
cout << segs.size() << endl;
return 0;
}
如果对您有帮助 能否给我点个 码字不易 感谢观看~~