题意

题目链接

Sol

按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案。但是对于此题来说好像不好搞

另一种思路是枚举最小的区间长度是多少,这样我们把所有区间按长度排序后可以二分出满足条件的最短的区间长度

观察后不难发现,较长区间的长度一定是随着短区间长度的增加而单调递增的。

直接用双指针维护即可。

判断是否可行也就是是否有一个点被覆盖了\(m\)次,离散化后线段树维护。。

经验:

  1. 该类问题的两种思路
  2. 最大值的单调性
  1. #include<bits/stdc++.h>
  2. #define ls k << 1
  3. #define rs k << 1 | 1
  4. using namespace std;
  5. const int MAXN = 4e6 + 10, INF = 1e9 + 10;
  6. inline int read() {
  7. char c = getchar(); int x = 0, f = 1;
  8. while(c < '0' || c > '9') {if(c == '-')f =- 1; c = getchar();}
  9. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  10. return x * f;
  11. }
  12. int N, M;
  13. struct Node {
  14. int l, r, mx, f, siz;
  15. }T[MAXN];
  16. struct Line {
  17. int l, r;
  18. bool operator < (const Line &rhs) const {
  19. return abs(r - l) <= abs(rhs.r - rhs.l);
  20. }
  21. }a[MAXN];
  22. int date[MAXN], num;
  23. void add(int k, int val) {
  24. T[k].mx += val;
  25. T[k].f += val;
  26. }
  27. void pushdown(int k) {
  28. if(!T[k].f) return ;
  29. add(ls, T[k].f); add(rs, T[k].f);
  30. T[k].f = 0;
  31. }
  32. void update(int k) {
  33. T[k].mx = max(T[ls].mx, T[rs].mx);
  34. }
  35. void Build(int k, int ll, int rr) {
  36. T[k].l = ll; T[k].r = rr;
  37. if(ll == rr) return ;
  38. int mid = ll + rr >> 1;
  39. Build(ls, ll ,mid); Build(rs, mid + 1, rr);
  40. }
  41. void Add(int k, int ll, int rr, int val) {
  42. if(ll <= T[k].l && T[k].r <= rr) {add(k, val); return ;}
  43. pushdown(k);
  44. int mid = T[k].l + T[k].r >> 1;
  45. if(ll <= mid) Add(ls, ll, rr, val);
  46. if(rr > mid) Add(rs, ll, rr, val);
  47. update(k);
  48. }
  49. main() {
  50. // freopen("testdata.in", "r", stdin);
  51. N = read(); M = read();
  52. for(int i = 1; i <= N; i++)
  53. a[i].l = read(), a[i].r = read(), date[++num] = a[i].l, date[++num] = a[i].r;
  54. // puts("-1");
  55. //sort(a + 1, a + N + 1);
  56. stable_sort(a + 1, a + N + 1);
  57. // puts("-1");
  58. sort(date + 1, date + num + 1);
  59. num = unique(date + 1, date + num + 1) - date - 1;
  60. for(int i = 1; i <= N; i++) a[i].l = lower_bound(date + 1, date + num + 1, a[i].l) - date,
  61. a[i].r = lower_bound(date + 1, date + num + 1, a[i].r) - date;
  62. Build(1, 1, num);
  63. int ans = INF, now = 0;
  64. for(int i = 1; i <= N; i++) {
  65. while(T[1].mx < M && (now < N))
  66. now++, Add(1, a[now].l, a[now].r, 1);
  67. if(T[1].mx >= M) ans = min(ans, date[a[now].r] - date[a[now].l] - ( date[a[i].r] - date[a[i].l]));
  68. Add(1, a[i].l, a[i].r, -1);
  69. }
  70. printf("%d\n", ans == INF ? -1 : ans);
  71. }
  72. /*
  73. */

BZOJ4653: [Noi2016]区间(线段树 双指针)的更多相关文章

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

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

  2. BZOJ4653:[NOI2016]区间(线段树)

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

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

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

  4. [NOI2016]区间 线段树

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

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

    BZOJ4653 UOJ222 考虑二分.那么我们可以按区间长度从小到大枚举每个区间,对每个区间可以得到一个可用区间长度范围. 我们要求是否存在一个点被这些区间覆盖至少\(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. 视图view没有主键,但可以添加唯一索引

    视图没有主键,但可以加上唯一索引 大致可以这样理解:视图是张虚拟的表.视图所对应的数据不进行实际的存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表. ...

  2. [CQOI2012][bzoj2668] 交换棋子 [费用流]

    题面 传送门 思路 抖机灵 一开始看到这题我以为是棋盘模型-_-|| 然而现实是骨感的 后来我尝试使用插头dp来交换,然后又惨死 最后我不得不把目光转向那个总能化腐朽为神奇的算法:网络流 思维 我们要 ...

  3. Java Web之数据库连接池

    数据库连接池 一.数据库连接池 1. 数据库连接池就是存放数据库连接(Connection)的集合 2. 我们获取一个数据库连接是一个相对很麻烦的过程,如果我们获取一个数据库连接,使用一次以后就给它关 ...

  4. P2156 [SDOI2009]细胞探索

    $ \color{#0066ff}{ 题目描述 }$ 生物课上,老师开始为同学们介绍细胞.为了加深同学们的印象,老师在一张N×M的矩阵中定义了一种细胞,矩阵中仅有井号"#"和点&q ...

  5. kuangbin专题十六 KMP&&扩展KMP HDU2609 How many (最小字符串表示法)

    Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...

  6. kuangbin专题十六 KMP&&扩展KMP HDU2087 剪花布条

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和小 ...

  7. Nginx02---指令集实现静态文件服务器

    location 实现静态服务器,就是root和alias命令,他们位于location文件块中,详细:https://www.jianshu.com/p/4be0d5882ec5 root root ...

  8. spring读取配置文件,且获取bean实例

    import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.Xm ...

  9. How to pass multiple parameters in PowerShell invoke-restmethod

    Link: http://www.tagwith.com/question_322855_how-to-pass-parameters-in-powershell-invoke-restmethod- ...

  10. asp:FileUpload 控件上传多文件

    <asp:FileUpload runat="server" ID="imgUpload" AllowMultiple="true" ...