首页 > 编程语言 >基础算法:区间合并

基础算法:区间合并

时间:2023-10-01 16:23:00浏览次数:22  
标签:end int res 合并 segs seg start 算法 区间

1、区间合并

以AcWing.803为例,题目要求如下:

给定n个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3] 和 [2,6]可以合并为一个区间 [1,6]。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含两个整数 l 和 r。

输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围
1≤n≤100000,−10^9≤li≤ri≤10^9

输入样例:
5
1 2
2 4
5 6
7 8
7 9

输出样例:
3

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

using PII = pair<int, int>;

const int N = 1e6 + 10;

vector<PII> segs;

void merge(vector<PII>& segs, vector<PII>& res) {
    int start = -2e9, end = -2e9;
    for (auto seg : segs) {
        if (seg.first > end) {
            if (start != -2e9) res.push_back({ start, end });
            start = seg.first, end = seg.second;
        }
        else {
            end = max(end, seg.second);
        }
    }

    if (start != -2e9) res.push_back({ start, end });
    
    return;
}

int main() {
    int n;
    cin >> n;

    int l, r;
    while (n--) {
        cin >> l >> r;
        segs.push_back(make_pair(l, r));    
    }

    sort(segs.begin(), segs.end());
    
    vector<PII> res;
    merge(segs, res);

    cout << res.size() << endl;
    
    return 0;
}

 

标签:end,int,res,合并,segs,seg,start,算法,区间
From: https://www.cnblogs.com/karinto/p/17738950.html

相关文章

  • 算法模板
    算法模板1.排序(1)快速排序(NoSTL)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintn,a[100010];voiddfs(intl,intr){ if(l>=r) return; intpos=(l+r)>>1; intx=a[pos]; inti=l,j=r; while(i<=j) {......
  • FFT变换算法
    FFT(FastFourierTransform)算法是一种高效的离散傅里叶变换(DFT)计算方法,它通过分解长度为N的DFT计算成若干个长度为N/2的DFT计算,从而大大减少了运算量。由于其快速、高效、稳定等特点,FFT算法在数字信号处理、图像处理、通信系统等领域得到了广泛应用。常用的FFT变换算法包括蝶形运算......
  • C/C++学习 -- 流加密算法(RC4算法)
    在信息安全领域,加密算法扮演着至关重要的角色。其中,RC4算法是一种广泛使用的流密码算法,用于数据的保密性和机密性。本文将深入探讨RC4算法的概述、特点、原理,以及提供C语言和C++语言实现RC4算法的代码案例。一、RC4算法概述RC4算法,又称RivestCipher4或Ron'sCode4,是一种流密码(St......
  • 雷德算法介绍
    雷德(Radix)算法是一种基于FFT(FastFourierTransform)算法的计算方法,其基本思想是将长度为N的DFT计算分解为O(logN)个长度为2的DFT计算,并通过不断的合并操作得到最终的结果。雷德算法的基本过程如下:将输入序列按二进制反转的顺序重新排列,以得到新的输入序列;将新的输入序列划分为两个......
  • golang 代码实现一个工具函数:用于合并两个go map
    内容来自对chatgpt的咨询初始化一个新map,然后遍历两个旧map,把每个元素都存到新map即可。packagemainimport"fmt"//MergeMaps创建一个新的map用于保存合并后的值。返回新的map。funcMergeMaps(destMap,sourceMapmap[string]interface{})map[string]inter......
  • 视频融合/视频汇聚平台加智能ai算法助力农业高质量生产
    我国是农业大国,随着新兴技术如AI的迅猛发展,大数据和互联网等技术已应用于农业生产中的各个环节,以提高土地利用率、降低成本、提高生产效率。智慧农业因此而兴起。智慧农业解决方案是根据农业生产的需求与现代网络发展状况而设计的。它利用人工智能技术,结合农业物联网、移动互联网......
  • 分析视频监控/视频汇聚平台EasyCVR分析网关车辆检测/车牌识别算法及应用场景
    在数字化时代,由于大众对出行要求的提升,汽车数量不断增加,给城市和交通管理带来了很多挑战。为了应对这些问题,旭帆科技开发了一套AI智能车辆检测与车牌识别算法,为交通管理和车辆安全提供高效的解决方案。AI车辆检测和车牌识别算法集成了多种技术,如光学字符识别(OCR)和云计算等,能够从......
  • 基于weka的数据库挖掘➖聚类方法K-Means算法
    基于weka的数据库挖掘➖聚类方法K-Means算法目标1.掌握k-Means算法的原理和聚类过程2.可以使用k-Means算法实现对给定样本集的聚类。内容1.采用k-Means算法,对给出的15个样本数据进行聚类,聚类簇数可自由调整,最后输出簇数为2、3、5的聚类结果。k-Means初识k-Means算法是一种......
  • Miller-Rabin算法
    原文链接:https://blog.csdn.net/qq_43227036/article/details/100336234OK,前面已经讲了很多判断素数的方法,在判断一个数是否为素数时我们可以采用试除法,但如要求1-n的范围那么时间复杂度很高,所以有了线性的筛法求素数。但如果为了判断一个大数是否为素数却要消耗很大的空间,这显......
  • Go 1.19 排序算法
    插入排序(InsertionSort)插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素插入到已经排好序的序列中,从而得到一个新的有序序列。插入排序的具体过程如下:从第一个元素开始,认为它已经是有序的序列。取出下一个元素,在已经排序的序列中从后向前扫描。如果已经排序的......