[NOI2016 D2T1]区间
题目大意:在数轴上有$n$个闭区间$[l_1,r_1],[l_2,r_2],...,[l_n,r_n]$。现在要从中选出 $m$ 个区间,使得这 $m$ 个区间共同包含至少一个位置。输出被选中的最长区间长度减去被选中的最短区间长度,若多解,输出最小的一个
题解:把区间按长度排序,然后把左右端点离散化,双指针扫一下,线段树维护一下有没有点被覆盖$ \geq m$次即可
卡点:1.因为有$2\times n$个点,所以线段树开小了一倍
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 500010
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, tot, M, ans;
int p[maxn << 1];
struct interval {
int l, r, len;
bool operator < (const interval & b) const {return len < b.len;}
} s[maxn];
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
int V[maxn << 3], cov[maxn << 3];
void pushdown(int rt) {
int &tmp = cov[rt];
V[rt << 1] += tmp;
V[rt << 1 | 1] += tmp;
cov[rt << 1] += tmp;
cov[rt << 1 | 1] += tmp;
tmp = 0;
}
void add(int rt, int l, int r, int L, int R, int num = 1) {
if (L <= l && R >= r) {
V[rt] += num;
cov[rt] += num;
return ;
}
if (cov[rt]) pushdown(rt);
int mid = l + r >> 1;
if (L <= mid) add(rt << 1, l, mid, L, R, num);
if (R > mid) add(rt << 1 | 1, mid + 1, r, L, R, num);
V[rt] = max(V[rt << 1], V[rt << 1 | 1]);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &s[i].l, &s[i].r);
s[i].len = s[i].r - s[i].l;
p[i - 1 << 1 | 1] = s[i].l;
p[i << 1] = s[i].r;
}
tot = n << 1;
sort(p + 1, p + tot + 1);
sort(s + 1, s + n + 1);
M = lower_bound(p + 1, p + tot + 1, p[tot]) - p;
for (int i = 1; i <= n; i++) {
s[i].l = lower_bound(p + 1, p + tot + 1, s[i].l) - p;
s[i].r = lower_bound(p + 1, p + tot + 1, s[i].r) - p;
}
int L = 1;
ans = inf;
for (int i = 1; i <= n; i++) {
add(1, 1, M, s[i].l, s[i].r);
while (V[1] >= m && L <= i) {
ans = min(ans, s[i].len - s[L].len);
add(1, 1, M, s[L].l, s[L].r, -1);
L++;
}
}
printf("%d\n", (ans == inf) ? -1 : ans);
return 0;
}
[NOI2016 D2T1]区间的更多相关文章
- 【BZOJ4653】【NOI2016】区间(线段树)
[BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...
- 「NOI2016」区间 解题报告
「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...
- 【NOI2016】区间 题解
题目大意: 有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值. 思路: 按区间的长度从小到大排序,可知连续的几个区间最优,则用两个指针指其头尾,线性扫描,再用线段树区间 ...
- 【BZOJ4653】【NOI2016】区间 线段树
题目大意 数轴上有\(n\)个闭区间\([l_1,r_1],[l_2,r_2],\ldots,[l_n,r_n]\),你要选出\(m\)个区间,使得存在一个\(x\),对于每个选出的区间\([l_i, ...
- 【NOI2016】区间
目链接:http://uoj.ac/problem/222 在数轴上有 n 个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m 个区间共同包含至少 ...
- UOJ222 【NOI2016】区间
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- LOJ#2086. 「NOI2016」区间
$n \leq 500000$个区间,从中挑出一些,使得至少有一个点被$m$个选中区间包含,且选中区间长度的极差最小. 区间题死脑筋晚期:把区间按左端点排序,然后右端点用个优先队列来弹,然后需要维护下 ...
- 「NOI2016」区间
传送门 Luogu 解题思路 对于选出的区间,我们可以直接用线段树维护区间内单点被覆盖次数最大值. 那么解题重心便落在了选取方式上. 为了让最大值最小,考虑尺取,不能二分,降低效率而且不好写. 先将区 ...
- 【NOI2016】区间 题解(线段树+尺取法)
题目链接 题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小.求最小费用.费用定义为最长的区间长度减去最短区间长度. ------- ...
随机推荐
- 上传文件到阿里云linux服务器
在“运行”中输入cmd,打开控制台,切换到刚才Putty的安装目录下,我的是E:\Putty,然后输入pscp命令,我们需要这个命令来实现文件的上传.如下图所示,命令格式为: pscp D:\recy ...
- MySql指令的执行顺序
1:From 2:On 3:Join 4:Where 5:Group by 5.1:函数 6:Having 7:Select 8:Distinct 9:Order by
- Asp.net 自定义CustomerSession 存放到Redis中
首先,引用 Redis 操作驱动组件:StackExchange.Redis.dll. 继承SessionStateStoreProviderBase 类, 实现方法: using System; u ...
- ODBC error in PHP: “No tuples available at this result index”
ODBC error in PHP: “No tuples available at this result index” 在执行存储过程的时候发生如题的错误,在stackoverflow上找到了相同 ...
- 20.2 解析与序列化【JavaScript高级程序设计第三版】
JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因.更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象.与XML 数据结构要解析成DOM 文档而 ...
- 九、IIC驱动原理分析
学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...
- Python学习手册之数据类型
在上一篇文章中,我们介绍了 Python 的异常和文件,现在我们介绍 Python 中的数据类型. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/99799 ...
- 回形矩阵--python
def bsm(n): a = [[0]*n for x in range(n)] p = 0 q = n-1 t = 1 while p < q: for i in range(p,q): a ...
- linux-课题练习1
1.创建组testgroup: 2.创建用户a2012,先采用默认设置创建,然后使该用户加入testgroup组. 3.创建用户a2013,其用户主目录为/tmp/a2013,其主组为testgrou ...
- Python3 time模块&datetime模块&random模块
''' time模块 ''' # import time # print(help(time)) # help()提供帮助 # print(time.time()) # 1970年开始到现在的秒数(时 ...