[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之MariaDB
MariaDB数据库的起源 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜 ...
- Angular : 绑定, 参数传递, 路由
如何把jquery导入angular npm install jquery --savenpm install @type/jquery --save-dev "node_modules/z ...
- 软件的按契约设计(DbC---Design by Contract)
一.DbC基本概念 DbC的思想源于商业活动中商家和用户的行为(义务和利益关系),双方都要遵守一个契约(合同),交易才能完成. 商家与用户的契约关系如下: 1. 商家必须提供某种产品(义务),并有权获 ...
- HyperLedger Fabric 1.4 超级账本简介(5.2)
超级账本(Hyperledger)是推动区块链跨行业应用的开源项目的总称,组织成员可以发起新的区块链项目,加入到超级账本项目(Hyperledger)中,但需要遵循Hyperledger的生命周期. ...
- win7 下安装oracle 11g出现错误: 启动服务出现错误 找不到服务OracleMTSRecoveryService
这种错误是在多次安装oracle都没有成功的情况下发生的. 正确安装oracle,是有前提条件的 1,安装最新的jdk,不是jre!!(并配好环境变量,在cmd中测试 java -version与ja ...
- 8.Mongodb备份与恢复
1.备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目 ...
- LeetCode:16. 3Sum Closest(Medium)
1. 原题链接 https://leetcode.com/problems/3sum-closest/description/ 2. 题目要求 数组S = nums[n]包含n个整数,找出S中三个整数 ...
- web端常见兼容性问题整理
一.html和css 各浏览器的默认内外边距不一致问题 最明显的是ul标签内外边距问题,ul标签在IE-7中,有个默认的外边距,但是在IE8以上及其他浏览器中有个默认的内边距. 解决办法:*{marg ...
- 「题目代码」P1034~P1038(Java)
P1034 C基础-求同存异 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main ...
- Ubuntu下使用Git_4
在这个第四个文章中,我将练习GIT的高级阶段了,由于高级阶段的内容转的比较多,我自己的代码除了我自己可以看懂意外,大家可能看不懂,所以我将会按照 http://git.wiki.navisec.it/ ...