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

Solution

先把区间按长度sort一下,然后双指针扫一下就好了,因为左指针向右移动的时候,右指针单调不减,所以复杂度$nlogn$

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N (1000009)
  5. using namespace std;
  6.  
  7. struct Node
  8. {
  9. int x,y,len;
  10. bool operator < (const Node &a) const{return len<a.len;}
  11. }L[N];
  12. struct Sgt{int max,add;}Segt[N<<];
  13. int n,m,b[N],num;
  14. int getid(int x){return lower_bound(b+,b+num+,x)-b;}
  15.  
  16. void Pushdown(int now)
  17. {
  18. Segt[now<<].max+=Segt[now].add;
  19. Segt[now<<|].max+=Segt[now].add;
  20. Segt[now<<].add+=Segt[now].add;
  21. Segt[now<<|].add+=Segt[now].add;
  22. Segt[now].add=;
  23. }
  24.  
  25. void Update(int now,int l,int r,int l1,int r1,int k)
  26. {
  27. if (l>r1 || r<l1) return;
  28. if (l1<=l && r<=r1)
  29. {
  30. Segt[now].max+=k;
  31. Segt[now].add+=k;
  32. return;
  33. }
  34. Pushdown(now);
  35. int mid=(l+r)>>;
  36. Update(now<<,l,mid,l1,r1,k);
  37. Update(now<<|,mid+,r,l1,r1,k);
  38. Segt[now].max=max(Segt[now<<].max,Segt[now<<|].max);
  39. }
  40.  
  41. int main()
  42. {
  43. scanf("%d%d",&n,&m);
  44. for (int i=; i<=n; ++i)
  45. {
  46. scanf("%d%d",&L[i].x,&L[i].y); L[i].len=L[i].y-L[i].x;
  47. b[i*-]=L[i].x; b[i*]=L[i].y;
  48. }
  49. sort(b+,b+*n+);
  50. num=unique(b+,b+*n+)-b-;
  51. sort(L+,L+n+);
  52.  
  53. int pos=,cnt=,ans=2e9;
  54. for (int i=; i<=n; ++i)
  55. {
  56. while (pos<n && Segt[].max<m)
  57. {
  58. ++pos; ++cnt;
  59. int x=getid(L[pos].x), y=getid(L[pos].y);
  60. Update(,,num,x,y,);
  61. }
  62. if (Segt[].max>=m) ans=min(ans,L[pos].len-L[i].len);
  63. int x=getid(L[i].x), y=getid(L[i].y);
  64. Update(,,num,x,y,-);
  65. }
  66. printf("%d\n",ans==2e9?-:ans);
  67. }

BZOJ4653:[NOI2016]区间(线段树)的更多相关文章

  1. BZOJ4653 [NOI2016]区间 [线段树,离散化]

    题目传送门 区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就 ...

  2. BZOJ4653: [Noi2016]区间(线段树 双指针)

    题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...

  3. 【BZOJ-4653】区间 线段树 + 排序 + 离散化

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 107  Solved: 70[Submit][Status][Di ...

  4. BZOJ.4653.[NOI2016]区间(线段树)

    BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(m\)次.这可以用线段树区间 ...

  5. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  6. Luogu P1712 [NOI2016]区间(线段树)

    P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...

  7. UOJ222 NOI2016 区间 线段树+FIFO队列

    首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度) 然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次.之后依次出队,直到所有点都被覆盖小于M次 修改和询 ...

  8. 洛谷$P1712\ [NOI2016]$区间 线段树

    正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...

  9. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

随机推荐

  1. js控制表格隔行变色

    只是加载时候隔行变一个颜色,鼠标滑动上去时候没有变化 <table width="800" border="0" cellpadding="0& ...

  2. C# 配置文件操作类

    注意添加引用:System.Configuration: using System; using System.Collections.Generic; using System.Text; usin ...

  3. 第6天:数据Array

    数组Array every() 方法测试数组的所有元素是否都通过了指定函数的测试. array.every callback[, thisArg] callback 被调用时传入三个参数:元素值,元素 ...

  4. FileSystemWatcher 监视指定目录中的变更

    .Net框架类库中的FileSystemWatcher如它的名称一样是一个用于监视文件系统变化的一个控件.使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录 ...

  5. linux的目录结构及文件基本操作

    1. linux的文件组织目录结构 linux的目录与window的区别 win以存储介质为主,主要以盘符及分区实现文件 管理,再下面才是目录. linux以树形目录结构的形式来构造整个系统,每一个目 ...

  6. OpenStack IceHouse 部署 - 1 - 架构说明

    参考架构 Architecture from OpenStack Install Guide Reference Architecture Network Isolation 在本次部署中,我们采用了 ...

  7. Thymeleaf学习记录(3)--语法

    语法: 标准表达式语法 简单表达: 变量表达式: ${...} 选择变量表达式: *{...} 消息表达式: #{...} 链接网址表达式: @{...} 字面 文本文字:'one text','An ...

  8. 如何在vscode里面调试js和node.js

    一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ...

  9. CSS(一)sytle

    一:CSS语法组成:  选择符 和声明(声明和声明之间用分号隔开)  声明部分:属性和属性值(用冒号链接)  语法:选择符{   属性1:属性值:   属性2:属性值:  } 所有的CSS语句都要放到 ...

  10. iView定制主题报错问题的解决方法

    按照iView官网来是这样的: 1. 在main.js当前目录下新建themes文件夹,里面新建一个叫blue.less的文件 2. 在mian.js里面引入blue.less文件 3. blue.l ...