acwing803区间合并(区间贪心)

1.题目描述

在这里插入图片描述

2.思路

将传入的区间范围排序,不同区间存在三种情况,第一种,维护区间和枚举区间有交集,比如维护区间范围[1,3],枚举区间范围[2,4],此时将两区间合并为[1,4],即将维护区间的ed更新为枚举区间的en。第二种,维护区间[1,3],枚举区间[1,2],此时维护区间不变,继续枚举下一个区间。第三种,维护区间与枚举区间无交集,维护区间[1,3],枚举区间[4,5],此时将维护区间写入保存数据的vector向量中,枚举区间变成新的维护区间,并与下一个枚举区间做操作,如果此时新的维护区间为最后一个区间,则将该区间写入向量中。

3.一些细节

1.进入merge函数时st,ed为初始边界,无限长,设为-2e9,进用作第一次边界更新时作比较使用,输入数据一定符合此时的边界范围。
2.第一次进入merge函数的for循环是为了更新区间,将无限长的区间更新为第一个维护区间,之后与下一个枚举区间比较。第一次迭代,更新区间;之后迭代,与更新的区间作操作。迭代完成后总会剩余一个最后的区间,需要将将此区间读入向量中。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int>PII;
const int N = 100010;
int n;
vector<PII>segs;
void merge(vector<PII>& segs)
{
	vector<PII>res;
	sort(segs.begin(), segs.end());
	int st = -2e9, ed = -2e9;
	for (auto it : segs)//某一时刻只维护一个区间[st,ed]
	{
		if (it.first > ed)
		{
			if (st != -2e9) res.push_back({ st,ed });//没有交集,直接往向量读入
			st = it.first, ed = it.second;//更新区间
		}
		else ed = max(ed, it.second);//有交集,将区间ed更新为长的那一个
	}
	if (st != -2e9) res.push_back({ st,ed });//循环判断条件是因为有可能传入的segs为空
	segs = res;
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int l, r;
		cin >> l >> r;
		segs.push_back({ l,r });
	 }
	merge(segs);
	cout << segs.size() << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰xinyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值