4653: [Noi2016]区间

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 934  Solved: 500
[Submit][Status][Discuss]

Description

在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。
对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。
求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1。

Input

第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n
接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。
N<=500000,M<=200000,0≤li≤ri≤10^9

Output

只有一行,包含一个正整数,即最小花费。

Sample Input

6 3
3 5
1 2
3 4
2 2
1 5
1 4

Sample Output

2

所有线段按长度从小到大排序,之后尺取

对于当前p和q,只考虑从第p条到第q条直线中取

将在[p, q]范围内的直线全部离加入线段树

如果线段树最值>=m,说明[p, q]范围内能取出刚好m条满足要求的直线,删除第p条直线,p++,

否则q++

ans = min(ans, len[q]-len[p])

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct Res
{int len;int l, r;bool operator < (const Res &b) const{if(len<b.len)return 1;return 0;}
}Line;
Line s[500005];
int cnt, k[1000015], tre[4004000], temp[4004000];
void Lazy(int l, int r, int x)
{int m;tre[x*2] += temp[x];tre[x*2+1] += temp[x];m = (l+r)/2;if(l!=m)temp[x*2] += temp[x];if(m+1!=r)temp[x*2+1] += temp[x];temp[x] = 0;
}
void Update(int l, int r, int x, int a, int b, int c)
{int m;if(a==0 || b==0)return;if(l>=a && r<=b){tre[x] += c;if(l!=r)temp[x] += c;return;}if(temp[x])Lazy(l, r, x);m = (l+r)/2;if(a<=m)Update(l, m, x*2, a, b, c);if(b>=m+1)Update(m+1, r, x*2+1, a, b, c);tre[x] = max(tre[x*2], tre[x*2+1]);
}
int main(void)
{int n, m, i, p, q, ans;scanf("%d%d", &n, &m);for(i=1;i<=n;i++){scanf("%d%d", &s[i].l, &s[i].r);k[++cnt] = s[i].l, k[++cnt] = s[i].r;s[i].len = s[i].r-s[i].l;}sort(s+1, s+n+1);sort(k+1, k+cnt+1);cnt = unique(k+1, k+cnt+1)-(k+1);for(i=1;i<=n;i++){s[i].l = lower_bound(k+1, k+cnt+1, s[i].l)-k;s[i].r = lower_bound(k+1, k+cnt+1, s[i].r)-k;}p = 1, q = 0;ans = 2147483647;while(q<=n && p<=n){while(tre[1]<m && q<=n){q++;Update(1, cnt, 1, s[q].l, s[q].r, 1);}while(tre[1]>=m){ans = min(ans, s[q].len-s[p].len);Update(1, cnt, 1, s[p].l, s[p].r, -1);p++;}}if(ans==2147483647)printf("-1\n");elseprintf("%d\n", ans);return 0;
}

bzoj 4653: [Noi2016]区间(尺取+线段树)相关推荐

  1. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

  2. 【BZOJ4653】[Noi2016]区间 双指针法+线段树

    [BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...

  3. 【bzoj4653】[Noi2016]区间 双指针法+线段树

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  4. BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)

    BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值) Solution 我们考虑用线段树维护此题. 先不考虑历史最值. 大概需要维护一种特殊的懒标记(x,y)(x,y)(x,y) ...

  5. BZOJ4653 尺取法 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...

  6. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...

  7. luogu P5142 区间方差(线段树、乘法逆元)

    luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...

  8. BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

    题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...

  9. 【 bzoj 4355 】 Play with sequence - 线段树乱搞

    先讲个故事... 据说某一天,claris扔了一道题到某群里面然后引起了不大的讨论~然后好学向上的whx同学发现了这题...聪明的whx想了很久...然后!whx发现看不懂claris给的暴力的证明. ...

最新文章

  1. debian10 ftp简单搭建
  2. vscode使用教程python-使用VS Code进行Python编程
  3. pip install lxml 总是失败
  4. VS2017 安装,建议大家都看一下这个在卸载,真人真事,防止扑街
  5. 计算机基础知识作业答案,计算机基础与应用作业答案ID及计算机基础知识笔试题.doc...
  6. 【操作系统】对操作系统的了解
  7. FreeSql使用WithSql+ ToSQL 查询数据
  8. Mac OSX操作系统安装和配置Zend Server 6教程(1)
  9. C语言 AI智能,五子棋 人机对战,人人对战
  10. c语言函数文档,C语言函数手册DOC.doc
  11. 图像的三种分形维数的计算方法
  12. 有用的各大网站论坛,学习、娱乐、生活...
  13. matlab如何运行程序
  14. 巴别时代php面试题,巴别时代遇到的函数
  15. 企业抖音蓝v怎么认证?详谈蓝v申请认证流程
  16. knife-4j 点击列表出现空白页怎么办?
  17. jQuery引起的用layer弹出层上传文件不能获取文件名的解决(thinkphp5)
  18. 3. KNN最近邻算法详解与关键技术剖析(理论篇)
  19. scrcpy投屏教程、及无线投屏
  20. Py西游攻关之基础数据类型

热门文章

  1. python编程入门-Python编程入门难不难
  2. python基础代码大全-python基础代码大全
  3. python3.7安装步骤-python安装步骤_python 3.7.2安装教程
  4. python怎么画简单图-python绘制简单彩虹图
  5. HTK语音识别基础教程.ppt
  6. 语音识别技术是什么_语音识别技术应用领域介绍
  7. linux ssh客户端乱码,Win10专业版下Open ssh客户端乱码咋办?
  8. Vue-Less的自动和手动引入
  9. MySQL Installer 8.0.21安装教程图文详解 转载
  10. vue + wangeditor封装富文本组件