首页 > 其他分享 >区间合并

区间合并

时间:2023-01-10 20:13:52浏览次数:53  
标签:2e9 int ed 合并 segs st res 区间

区间合并

区间合并,顾名思义,就是将一系列能合并的区间合并

核心代码

void merge(vector<PII>&segs)
{
    int st = 2e9, ed = -2e9;
    vector<PII> res;
    sort(segs.begin(), segs.end());
    //注意,(st, ed)的更新顺序相比于(i.first, i.second)是落后的
    for (auto i : segs)
    {
        if (ed < i.first)
        {
            if (st != 2e9) res.push_back({st, ed});
            st = i.first, ed = i.second;
        }
        else ed = max (ed, i.second);
    }
    if (st != 2e9) //这里是为了防止出现参数为空的情况
    res.push_back({st, ed});
    segs = res;
}

例题- 救生员

题目链接:https://www.acwing.com/problem/content/1752/
代码

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

typedef pair<int, int>PII;
vector<PII> segs;

int n;

int merge(vector<PII>& segs)//引用, 一方面是为了提高速度,还能增加程序的耦合度
{
	int res = 0;
	sort(segs.begin(), segs.end());
/*
核心思想:从头到尾,分别枚举缺少i号点的情况,最后取最大值
*/
	for (int i = 0; i < n; i ++ )
	{
        //注意下面两行要放到外层循环里面,因为我们相当于将“res.push_back({st, ed})"操作换成了,计算缺少i组点的情况下,对应的sum值。
		int sum = 0;
		int st = 2e9, ed = -2e9;
		for (int j = 0; j < n; j ++ )
		{
			if (i == j) continue;
			if (ed < segs[j].first)
			{
				if (st != 2e9) sum += ed - st;
				st = segs[j].first, ed = segs[j].second;
			}
			else ed = max(ed, segs[j].second);
		}
		if (st != 2e9) sum += ed - st;
		res = max(res, sum);
	}
	return res;
}

int main()
{
	cin >> n;
	for (int i = 0;  i < n; i ++ )
	{
		int l, r;
		cin >> l >> r;
		segs.push_back({l, r});
	}
	cout << merge(segs) << endl;
	return 0;
}

本题虽然简单,但是却体现了区间合并的本质及实现方式,是基于模板题的一种变式。

标签:2e9,int,ed,合并,segs,st,res,区间
From: https://www.cnblogs.com/Huayushanchuan/p/17041256.html

相关文章

  • SSIS_数据流转换(Union All&合并联接&合并)
    UnionAll:与sql语言 UnionAll 一样,不用排序,上下合并多个表。UnionAll转换替代合并转换:输入输出无需排序,合并超过两个表合并联接:有左连接、内连接、完全连接,只能关联......
  • Python 合并多张图片至一张图片
    PDF有多页,一次性转成JPG图片,JAVA报内存溢出,现改为,每一页存成一张图片,然后再将多张图片合成一张图片。安装库pip3installImage-ihttps://pypi.tuna.tsinghua.edu.......
  • 区间 DP
    概述区间DP是以DP设计从区间出发为特点的一类DP。状态设计往往包含\(l,r\)。初始化通常为\(dp_{l,l}=w_l\)。转移则不一而同,看下面的详解吧。实现倒......
  • mysql 合并数据集union
    在mysql中,可以利用UNION操作符来合并查询结果,该操作符用于将两个以上的SELECT语句的查询结果合并到一起,然后去除掉相同的记录;语法“查询语句1union查询语句2union..........
  • 连号区间数java
    小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间[L,R]里的所有元素(即此排列的第L个到第R个元......
  • 【优先队列】LeetCode 23. 合并K个升序链表
    题目链接23.合并K个升序链表思路把全部结点放入优先队列中,然后再依次组成新链表代码classSolution{publicListNodemergeKLists(ListNode[]lists){......
  • MySQL13 - UNION 合并结果集
    UNION合并查询结果集例子:查询工作岗位是MANAGER和SALESMAN的员工SELECTename,jobFROMempwherejob='manager'orjob='salesman';SELECTename,jobFROMe......
  • Luogu P2082 区间覆盖(加强版)
    链接难度:普及/提高-有\(n\)个区间\([s_i,t_i]\),求被这\(n\)个区间覆盖的长度。数据范围:\(n\le10^5,1\les_i<t_i\le10^17\)。把每个区间都换成一组匹配的括......
  • IDE committ规范及要求——多次提交的committ通过rebase合并
    第一步:切换到待上库分支 第二步:点击Git-->rebase  第三步:选择需要上库的分支以及rebase参数,点击REBASE:  第四步:squash多次修改成一次,全选多次修改-->点......
  • C++实现有序表--链表的合并操作代码
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructLNo......