题目大意:在数轴上有$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]区间的更多相关文章

  1. 【BZOJ4653】【NOI2016】区间(线段树)

    [BZOJ4653][NOI2016]区间(线段树) 题面 BZOJ 题解 \(NOI\)良心送分题?? 既然是最大长度减去最小长度 莫名想到那道反复减边求最小生成树 从而求出最小的比值 所以这题的套 ...

  2. 「NOI2016」区间 解题报告

    「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...

  3. 【NOI2016】区间 题解

    题目大意: 有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值. 思路: 按区间的长度从小到大排序,可知连续的几个区间最优,则用两个指针指其头尾,线性扫描,再用线段树区间 ...

  4. 【BZOJ4653】【NOI2016】区间 线段树

    题目大意 数轴上有\(n\)个闭区间\([l_1,r_1],[l_2,r_2],\ldots,[l_n,r_n]\),你要选出\(m\)个区间,使得存在一个\(x\),对于每个选出的区间\([l_i, ...

  5. 【NOI2016】区间

    目链接:http://uoj.ac/problem/222 在数轴上有 n 个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m 个区间共同包含至少 ...

  6. UOJ222 【NOI2016】区间

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. LOJ#2086. 「NOI2016」区间

    $n \leq 500000$个区间,从中挑出一些,使得至少有一个点被$m$个选中区间包含,且选中区间长度的极差最小. 区间题死脑筋晚期:把区间按左端点排序,然后右端点用个优先队列来弹,然后需要维护下 ...

  8. 「NOI2016」区间

    传送门 Luogu 解题思路 对于选出的区间,我们可以直接用线段树维护区间内单点被覆盖次数最大值. 那么解题重心便落在了选取方式上. 为了让最大值最小,考虑尺取,不能二分,降低效率而且不好写. 先将区 ...

  9. 【NOI2016】区间 题解(线段树+尺取法)

    题目链接 题目大意:给定$n$个区间$[l_i,r_i]$,选出$m$个区间使它们有一个共同的位置$x$,且使它们产生的费用最小.求最小费用.费用定义为最长的区间长度减去最短区间长度. ------- ...

随机推荐

  1. Java学习笔记三:Java的变量、常量、变量的类型及使用规则

    Java的变量.常量.变量的类型及使用规则 每一种语言都有一些具有特殊用途的词,Java也不例外,它们被称为关键字.关键字对 Java 的编译器有着特殊的意义. 一:Java中的关键字: 注:Java ...

  2. 《PHP内核探索系列文章》系列分享专栏

    <PHP内核探索系列文章>已整理成PDF文档,点击可直接下载至本地查阅 简介 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识 ...

  3. R语言学习笔记(十五):获取文件和目录信息

    file.info() 参数是表示文件名称的字符串向量,函数会给出每个文件的大小.创建时间.是否为目录等信息. > file.info("z.txt") size isdir ...

  4. python2.7入门---Number(数字)

        今天咱们来简单分享一下关于python中的一种数据类型和操作方法.费话不多说哈,咱们直接来进行实践加理论.首先,我们要知道,Python Number 数据类型用于存储数.数据类型是不允许改变 ...

  5. Linux安装防火墙

    1.安装防火墙 1)yum install iptables(centos) 安装IPtables服务 yum install iptables-services 2)清楚规则iptables -F ...

  6. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...

  7. Java Algorithm Problems

    Java Algorithm Problems 程序员的一天 从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就 ...

  8. vue整合mui

    步骤1:下载https://github.com/dcloudio/mui   步骤2:将下载来的包中的dist文件夹 放到vue项目的assets中 步骤3:修改webpack配置 找到build下 ...

  9. Htmlemail邮件发送

    /** * * @param path //发送附件路径 * @param name //附件名称 * @param hostName //邮件服务器名称 * @param port //服务器端口 ...

  10. 51单片机数码管字符H自右向左移动

    #include <reg51.h> #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr ...