题目描述:

今天又碰到之前似乎写过的一种题,区间覆盖中的一种比较简单的题型。

大意是给你n个区间段[l,r],某个点可能会被一些区间覆盖住,求最多的覆盖区间个数(n<=1e6,l,r<=1e9)

举几个题目例子:

1.你有一些任务从时间l开始,时间r结束,你需要招募一些员工去完成这些任务,一个员工不能同时做两个任务,求最少需要招募多少员工。

2.你手底下有1e9个员工,为了提高他们的工作效率,你会定期选取编号为l~r的员工发放奖金1元,求n轮之后被发放奖金最多的员工收到了多少次奖金

...

题目分析:

如果不看数据范围的话,最简单的思路就是把所有的区间都遍历一遍加上一,再遍历所有的区间,看看最大的数字是多少就行了。但是这样的复杂度是O(n*1e9),炸出了天际。如果稍微有点算法基础,比如小白我,马上会想到可以差分优化一步,要让区间[l,r]都加上1,可以a[l]++,a[r+1]--。但是我们不可能开出一个大小为1e9的数组,这时我想到了可以用map优化,这样算法复杂度就变成了O(n+1e9*log(1e9)),基本上一般的评测机还是会炸,但是碰巧这题所在的评测机给出了15s的上限

于是我交了一发玩玩

第一版代码:

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
signed main()
{int n;cin >> n;int ans = 0;for(int i = 1;i<=n;i++){int l,r;cin >> l >> r;//对了忘说了,这个题给的是左区间和区间长度,下面同理mp[l]++;mp[l+r]--;}int cnt = 0;for(int i = 1;i<=1e9;i++){if(mp.find(i)!=mp.end())cnt+=mp[i];ans = max(ans,cnt);}cout << ans << endl;
}

嘿,所有测试点跑了快两分钟,就在我担心是不是把评测机玩炸了的时候,它给过了!

但是这屎一样的复杂度,过了也没什么骄傲的,主要图一乐,随后我又交了一发,TLE了

只能说意料之中,接着我开始考虑第二次优化。

优化思路:

按照差分的思想往后一延伸,每个区间其实也就提供了左端加,右端减两个变化

我没必要遍历一遍区间[1,1e9],我只需要知道某个变化的点需要跳到哪个点去就行了

总共2*n个点,把每个点所在的位置排个序再遍个历,这样时间复杂度就被优化到了O(nlog(n))

终版代码:

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int N = 2e6+5;
struct node{int id;//位置int xx;//状态
}a[N];signed main()
{IOSint n;cin >> n;int ans = 0;int left,right;for(int i = 1;i<=n;i++){int l,r;cin >> l >> r;a[i].id = l;a[i+n].id = l+r;a[i].xx = 1;a[i+n].xx = -1;}sort(a+1,a+n*2+1,[&](node x,node y){if(x.id!=y.id)return x.id<y.id;return x.xx<y.xx;//这里注意排序的时候-1应该要在+1的前面,因为这个位置前面的区间已经覆盖不到了});int cnt = 0;for(int i = 1;i<=2*n;i++){cnt += a[i].xx;// ans = max(ans,cnt);if(ans<cnt){ans = cnt;// left = a[i].id;// right = a[i+1].id-1;}}// cout << left << " " << right << endl;cout << ans << endl;
}

同时会发现,如果把我注释的地方稍微修改一下,就可以得到具体是在哪个区间了

至此,所有优化完成。

感想:

虽然题目不难,就是基于差分思想进行排序的一个过程,但是给我的启发却很大。也许题目一眼看不出来思路的时候,我可以先从简单的思维入手,一步步进行优化,反而更容易得到答案。

关于区间覆盖下,求最多的覆盖次数问题相关推荐

  1. 矩阵最大覆盖问题:最多有多少个矩阵是重合覆盖的

    矩阵最大覆盖问题:最多有多少个矩阵是重合覆盖的? 提示:京东原题,根据线段最大重合问题改编而来 极其重要的基础知识: [1]线段最大重合问题:最多有多少条线段是重合的 文章目录 矩阵最大覆盖问题:最多 ...

  2. 最优装载问题(将一批集装箱装上一艘载重为轮船,其中集装箱i的重量为Wi(0<=i<=n-1) 最优装载问题是指在装载体积不受限制的情况下,求使得集装箱数目最多的装载方案 )

    最优装载问题是将一批集装箱装上一艘载重为轮船,其中集装箱i的重量为Wi(0<=i<=n-1) 最优装载问题是指在装载体积不受限制的情况下,求使得集装箱数目最多的装载方案 e.g: 设有重量 ...

  3. fillrect不填充被覆盖的区域 mfc_quot;条带覆盖quot;猜想的中二证明:quot;球面条线覆盖或点覆盖quot;积分π...

    注销:"黎曼猜想"复平面质数单向"虚"圆柱螺旋:几何法证明,技术应用​zhuanlan.zhihu.com 假设有这样一部针点打印机从球心对球面打印,外部有一台 ...

  4. 【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 / 变量 属性覆盖 | 子类初始化与属性覆盖 )

    文章目录 I . 属性覆盖基本方式 II . 属性覆盖的四种情况 III . 常量 ( val ) / 变量 ( var ) 属性覆盖 IV . 子类初始化时考虑覆盖属性的使用 I . 属性覆盖基本方 ...

  5. jpanel把原本内容覆盖掉_A5:APP关键词覆盖你该了解哪些

    A5:APP关键词覆盖你该了解哪些 点击上方蓝字关注我们 苹果ios/安卓-各大应用商店ASO优化大全 IOS关键词覆盖 1.苹果AppStore关键词搜索的权重排序为 app标题.副标题>ap ...

  6. java延迟覆盖_高效Java第九条覆盖equals时总要覆盖hashCode

    原标题:高效Java第九条覆盖equals时总要覆盖hashCode 高效Java第九条覆盖equals时总要覆盖hashCode 在每个覆盖了equals方法的类中,也必须覆盖hashCode方法. ...

  7. 详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点

    条件判定覆盖的定义: 设计足够多的测试用例,使被测程序中每个判定的每个条件的所有可能取值(真假)至少执行一次,并且每个判定的所有可能(真假)分支也至少执行一次 .通俗来讲,就是条件和判定覆盖的升华! ...

  8. mysql 覆盖索引 简书_mysql覆盖索引与回表

    select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查询了一个属性,为何检索过程完全不同? ...

  9. 胖终端和瘦终端的区别_企业级无线覆盖与家庭级无线覆盖的区别与发展趋势

    在科技日新月异的今天,5G与WIFI6等新型技术的出现将大大改变我们的生活,大家可能对WIFI6还有点陌生,接下来给大家解释一下何为WIFI6. IEEE 802.11ax又称为Wi-Fi 6,是一项 ...

最新文章

  1. Python将图片转成pdf(高清)论文党用~
  2. 对软件测试的理解(英文)
  3. 【报错】TypeError: ‘int‘ object is not callable_Python系列学习笔记
  4. 怎样玩转千万级别的数据
  5. NuGet是什么?理解与使用(下)
  6. 如何open一个新tab页面
  7. oracle索引未使用,oracle - 未使用主键索引 - SO中文参考 - www.soinside.com
  8. 数据库基础:什么是列?数据类型是什么?
  9. ubuntu14.04 64bit安装android的NDK开发环境
  10. 6to4隧道实验(华为设备)
  11. JUC与JVM并发编程学习笔记03
  12. 网易云再度升级!用Python爬取下载(一:思路)
  13. 对于can通信过滤器的理解
  14. 物联网技术,主要包括哪些核心技术
  15. android自带下拉阻尼动画,Android 自带阻尼效果的ScrollView,仿ios效果
  16. linux mud 游戏,150919神奇的mud
  17. 5角硬币中的币王,已价值16000元,谁家有?
  18. 黄土高原主要是什么树木
  19. 安徽工业大学计算机组成原理,安徽工业大学工商学院 计算机组成原理试卷12至13学年A卷...
  20. 【模电实验】基尔霍夫定律、叠加定理和戴维南定理验证实验

热门文章

  1. 大整数加法java_JAVA 大整数加法的实现
  2. 早安,小康社会的第一天
  3. mac安全隐私中没有任何来源
  4. matlab定义双精度型变量_matlab里,怎样定义变量类型
  5. 成都旅游 必吃火锅 看蜀大侠龙头火锅炼成记
  6. 正确理解Linux的“多用户、多任务、多线程”
  7. Steam流的中间方法
  8. Express-基础语法
  9. 《道德经》程序员版第四十二章
  10. 港股香港上市的方式都有哪些