求多个区间合并后区间大小的巧妙解决方法【差分】

  上图一共有5个区间,分别是[0,2]、[2,4]、[8,11]、[7,11]、[15,18]。如果要求这些区间合并后区间的大小,有两种简单的方法。

  方法一:比较每两个区间的范围,如果两个区间有交集,则合并它们。最后所有区间会合并成几个离散的大区间,结果为这些区间大小之和。这种方法的时间复杂度是O(n^2)。

  方法二:使用一个可以覆盖所有区间范围的数组,对每个区间进行标记,结果为数组中被标记元素的个数。这种方法的时间复杂度是O(nm)。

  注:n是区间个数,m是所有区间总的范围。

  如果n和m都比较大,那么上述两种方法的效率都不高。这里有一种很巧妙的解决这个问题的方法,它的时间复杂度是O(n+m)。使用一个可以覆盖所有区间范围的数组flg,初始化时将数组中的元素都置为0。对于每一个区间[l,r],将flg[l]++,flg[r+1]--。最后使用一个累加器cnt,初始置为0。依次扫描数组中的每一个元素,对于第i个元素,cnt+=flg[i]。此时,若cnt>0,则说明i在某些区间中;若cnt==0,则证明i不在任何区间中。统计cnt>0的元素个数即可。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <deque>
#include <map>
#include <set>
using namespace std;
#define ll long long
const double PI = acos(-1.0);
const int maxn = 101;
const int INF = 0x3f3f3f3f;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};

int n,m;
int f[maxn],cnt=0,sum=0;
struct node
{
    int l,r;
}a[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&a[i].l,&a[i].r);
    }
    for(int i=0;i<n;i++)
    {
        f[a[i].l]++;
        f[a[i].r+1]--;
    }
    for(int i=0;i<m;i++)
    {
        sum+=f[i];
        if(sum>0)
            cnt++;
    }
    printf("%d\n",cnt);
}

原文地址:https://www.cnblogs.com/Roni-i/p/9565158.html

时间: 2024-11-05 12:32:59

求多个区间合并后区间大小的巧妙解决方法【差分】的相关文章

网站启动SSL, http变为https后,session验证码错误解决方法

网站启动SSL, http变为https后,session验证码错误解决方法 最近公司需要后台启动安全证书,证书安装完毕后,后台老提示 验证码错误,经过几天的研究,此问题已经得到有效解决,现把方法如下. 一.问题展示 看到此问题后,我求助了伟大的互联网,网上大概的解决方法,是说要写两个session,不能相互互通,按照这个思路,我整了几天不见好,后来我重新写了一段代码,问题解决,其实根本不需要写两个session,先公布解决方法. 二.解决方法 原来的验证码代码 <script language

安装Wamp后 Apache无法启动的解决方法

安装Wamp后 Apache无法启动的解决方法,网上的解决方案可以说是五花八门,有些说了一大推,一点作用都起不到. 其实解决方法只需两步: 1.安装路径不能包含有中文,这个我不知道为什么,总之如果安装路径中包含有中文,接下来无论做多少配置工作都是徒劳. 2.安装好后 修改httpd.conf文件 把里面的80端口 改成其他端口 比方改为:8080 ,如果没有端口冲突可以不用修改. 做好以上这两步重启Wamp就可以了. 就这么简单,没必要搞太多东西.

解决安装VC6.0后出现MSDEV.EXE错误解决方法

问题:安装VC6.0后,在打开项目或添加文件时,出现如下错误: 可能导致原因:由于Ms安装软件的兼容性问题,导致VC6.0安装不完全, 解决方法:--网上打sp6补丁的方法貌似不可用,所以可以采用另一种方法 1.在下面的网站下载FileTool.exe http://support.microsoft.com/kb/241396/en-us      2.FileTool.exe是个自解压文件,执行它,解压到某个目录下 3.解压后的文件是一个VC工程,在VC6中编译它 4. 在dsw文件上右键“

【jquery】ajax 请求成功后新开窗口被拦截解决方法

问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所

IIS7下js文件启用Gzip后却不压缩的解决方法

本文转载:http://www.jb51.net/article/26340.htm IIS7下js文件启用Gzip后却不压缩的解决方法IIS7已经启用静态文件压缩(Gzip)但是死活不压缩,查找后发现是II7下MIME类型设置问题 将.js的MIME类型设置为application/javascript 再查看页面,已经启用了Gzip. 不过,几个天后又发现有的js文件被压缩,有的却没有. 查找原因发现是引用js文件是没有设置type <script></script> <

Ubuntu关机后会自动重启的解决方法

之前我装了ubuntu 14lts 开发版之后,本来用的好好的,但闲着没事更新了一下内核.之后就遇到ubuntu关机5秒后会自动重启这个问题,我有位用kilin的朋友也遇到这个问题.我反复研究发现,如果你的电脑插着U盘的话,关机是可以正常的,但这种方法不是很友好啊.之后,在贴吧看到最好的解决方法,只要联网状态下,在terminal输入如下命令即可解决. sudo apt-get install laptop-mode-tools Ubuntu关机后会自动重启的解决方法

realarm Android系统编译后内核无法启动的解决方法

由于之前版本使用的内核并非uImage格式,而在编译时使用的是非uImage格式编译,所以照成无法启动. 解决方法是,在编译内核时使用make uImage方式编译. 修改根目录下的build_realv210.sh文件,如下图所示 另外注意上图中CPU_JOB_NUM这个参数,要根据自己的电脑配置来选择,该参数在该文件的起始处设置,可以设置成电脑CPU核心数的2倍,例如:如果核心数为2,那么设置成4即可. 完整脚本下载地址:http://download.csdn.net/detail/u01

关于protel 99se 汉化后某些菜单消失的解决方法

本人在使用protel 99se 画PCB时,遇到了好些问题,通过网上查资料基本都解决了. 下面给大家分享 关于protel 99se 汉化后某些菜单消失的解决方法. 其他的许多看不见的菜单也可以自己通过下面的方法调用出来. 记得自己刚毕业那会用软件总是喜欢用中文版的,到处找什么“汉化”补丁之类.原以为这样能对软件的使用有更加清晰的认识,其实这样反而会更加麻烦.首先这不同的翻译者对同一个英文单词的翻译是不一样的,更何况专业英语单词,那可真是五花八门.二来真正用软件工具熟练的工程师基本上就是用的英

百度地图生成器添加标注后图标不显示的解决方法

作为传统企业网站的联系我们页面里,一般都会加个地图,如果只有文字描述,会显得很LOW. 百度地图生成器(http://api.map.baidu.com/lbsapi/creatmap/)就很好的满足了这一部分用户的诉求,快速简单的给自己网页添加一个加标注的地图,但是美中不足的,现在这个百度地图生成器添加标注后,标注图标不显示,如下图: 解决方法也很简单,只要找到生成的代码中的icon地址: http://app.baidu.com/map/images/us_mk_icon.png 替换成这个