我的代码
//
// Created by Genes on 2020/12/11.
//
// 区间合并
#include<iostream>
#include<vector>
#include<algorithm>
#define ios \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr)
using namespace std;
typedef pair<int, int> pii;
int n;
vector<pii> seg;
int main() {
ios;
cin >> n;
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
seg.push_back({l, r});
}
sort(seg.begin(), seg.end());
int ans = 1;
int end = seg[0].second;
for (int i = 1; i < seg.size(); i++) {
if (seg[i].first > end) {
end = seg[i].second;
ans++;
} else if (seg[i].second > end) {
end = seg[i].second;
}
}
cout << ans << endl;
return 0;
}
y总的
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int> PII;
int n;
void merge(vector<PII> &interval)
{
vector<PII> ans;
sort(interval.begin(), interval.end()); //! pair排序 优先左端点, 再以右端点排序
int st = -1e9-10, ed = -1e9-10; //! 只要比 -1e9 小就可以
for(auto item:interval)
{
if(ed<item.first) //! 第一段区间一定是 ed< item.first
{
if(st!=-1e9-10) ans.push_back({st,ed}); //! 第一次在这里初始化
st = item.first, ed = item.second;//! 第一段区间从这里开始
}
else ed = max(ed, item.second);
}//todo 这个循环结束之后还会剩下一个区间
if(st!=-1e9-10) ans.push_back({st,ed}); //! 如果不是空的 那我们就加上一段
interval = ans;
}
int main(void)
{
ios::sync_with_stdio(false);
cin >> n;
vector<PII> interval;
while(n--)
{
int l, r;
cin >> l >> r;
interval.push_back({l, r});
}
merge(interval);
cout << interval.size() << endl;
return 0;
}
if(st!=-1e9-10)这句话可以不写吧,只要n>=1至少有一个区间的时候就不会出现st还是初始值的情况
为什么循环结束之后还会剩下一个区间,而且一定要加上呢?最后这个区间不会和上一个区间有交集吗?
更新完最后一个区间,循环已经结束了,因此要在后面将最后一个区间插入ans。
可以啊,这个代码思路挺清晰的,也简单
你的代码更简洁哦,orz
这道题为什么要用左端点排序啊
按右端点排序也能做
我用最大不相交区间做为什么错了www
可以模拟一下这个样例
额,我确实卡着了,但我模拟过了,一脸蒙圈,纸都不够了
//todo 这个循环结束之后还会剩下一个区间
if(st!=-1e9-10) ans.push_back({st,ed});
为什么会剩下一个区间??
剩下还有一个序列,但循环中没有放进ans,因为它是序列中的最后一个序列
3q
请问 ios::sync_with_stdio(false);是什么意思呀?
谢谢
cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种
方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混
用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,
如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);
这样就可以取消cin于stdin的同步了。
这样可以加速cin的读入速度
interval.size()是不是只记录first或scond的数据个数????
不是 first和scond是一对, 记录他们有几对 pair
哦哦。谢谢
tql
推导的类型是什么,在这里auto等价于哪个类型呢?(我想知道在这里auto可以用什么来替代)
auto会根据你附的值的类型定义类型,这里interval是vector[HTML_REMOVED] >类型,可以用vector[HTML_REMOVED] >来替换。但你这里替换了之后for循环也要改变一下哦。for(vector[HTML_REMOVED] > item=interval.begin();tiem!=interval.end();item++)
您好,我想问一下auto对应着什么类型? 如果把auto 换掉, 下面对应的item 变量是不是也需要改变?
您好, for(auto xx:xx) 是c++的一种遍历的方式
具体可看 https://blog.csdn.net/HW140701/article/details/78833486