首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度)

然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次。之后依次出队,直到所有点都被覆盖小于M次

修改和询问覆盖次数可以用线段树实现

  1. //C++11 code
  2.  
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6.  
  7. ;
  8. const int inf=0x7f7f7f7f;
  9.  
  10. struct Range
  11. {
  12. int left,right;
  13. int len;
  14. void assign(int l,int r) { left=l; right=r; len=r-l; }
  15. };
  16.  
  17. struct SegTree
  18. {
  19. struct Node
  20. {
  21. ; //max-val
  22. ;
  23. int total() { return val+tag; }
  24. };
  25. Node node[maxN<<];
  26. int size;
  27. int _val;
  28.  
  29. void update(int cur,int right)
  30. {
  31. node[cur].val = std::max(node[cur+].total(),node[right].total());
  32. }
  33. void add(int L,int R,int val)
  34. {
  35. _val=val;
  36. __add(,L,R+,,size);
  37. }
  38. void __add(int cur,int rL,int rR,int nL,int nR)
  39. {
  40. if(rL<=nL && rR>=nR)
  41. {
  42. node[cur].tag+=_val;
  43. return;
  44. }
  45. ;
  46. );
  47. ,rL,rR,nL,mid);
  48. if(rR>mid) __add(right,rL,rR,mid,nR);
  49. update(cur,right);
  50. }
  51. ].total(); }
  52. };
  53.  
  54. Range rg[maxN];
  55. SegTree segt;
  56.  
  57. int N,M;
  58. ];
  59. int valNum;
  60.  
  61. void input()
  62. {
  63. scanf("%d%d",&N,&M);
  64. int tl,tr;
  65. ;i<N;i++)
  66. {
  67. scanf("%d%d",&tl,&tr);
  68. buf[i<<]=tl;
  69. buf[(i<<)+]=tr;
  70. rg[i].assign(tl,tr);
  71. }
  72. }
  73.  
  74. void discretize()
  75. {
  76. std::sort(buf,buf+(N<<));
  77. valNum=std::unique(buf,buf+(N<<))-buf;
  78. ;i<N;i++)
  79. {
  80. rg[i].left=std::lower_bound(buf,buf+valNum,rg[i].left)-buf;
  81. rg[i].right=std::lower_bound(buf,buf+valNum,rg[i].right)-buf;
  82. }
  83. }
  84.  
  85. int solve()
  86. {
  87. int res=inf;
  88. auto cmpIdx=[](const Range& A,const Range& B)->bool { return A.len<B.len; };
  89. std::sort(rg,rg+N,cmpIdx);
  90. discretize();
  91. segt.size=valNum;
  92. ,tail=-;
  93. )
  94. {
  95. while((++head)<N && segt.askAll()<M)
  96. segt.add(rg[head].left,rg[head].right,);
  97. if(segt.askAll()<M) break;
  98. else --head;
  99. while(segt.askAll()==M)
  100. {
  101. ++tail;
  102. res=std::min(res,rg[head].len-rg[tail].len);
  103. segt.add(rg[tail].left,rg[tail].right,-);
  104. }
  105. }
  106. :res;
  107. }
  108.  
  109. int main()
  110. {
  111. input();
  112. printf("%d\n",solve());
  113. ;
  114. }

UOJ222 NOI2016 区间 线段树+FIFO队列的更多相关文章

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

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

  2. [NOI2016]区间 线段树

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

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

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

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

随机推荐

  1. 自己记录java环境搭建之-maven

    简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...

  2. 如何将下载好的jar包添加到maven本地仓库

    1.首先在pom.xml中添加 <dependency>    <groupId>org.springframework.security</groupId>    ...

  3. JavaWeb学习总结(1-53)

    本文转自孤傲苍狼 博客,JavaWeb学习总结 专题,一共53集,讲解简洁清晰,适合入门,链接和截图如下 http://www.cnblogs.com/xdp-gacl/category/574705 ...

  4. UVa11925 Generating Premutations

    留坑(p.254) #include<cstdio> #include<cstring> #include<cstdlib> #include<algorit ...

  5. SQL 存储过程 通过多个ID更新数据 分类: SQL Server 2014-12-08 16:08 299人阅读 评论(0) 收藏

    下面举个例子说明: 我想让一部分品牌的名称(即Brand_Name)后面加上1,Brand_ID是主键,sql语句很容易实现,但是存储过程如何写呢? 错误写法如下: //*************** ...

  6. ListView 分类: WinForm 2014-07-18 22:03 289人阅读 评论(0) 收藏

    一.ListView类(转载) 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLin ...

  7. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  8. 在32位Windows 8或Windows 7上安装Windows Phone 8 SDK

    这需要一点技巧的,其实WPSDK8是支持32位系统的,可因为微软脑残的限制,安装方法如下: 这里必需要有一个工具,OllyDbg 2.0,去官网下载即可. 启动OD,在菜单打开选项窗口,在Events ...

  9. TCP SOCKET中backlog参数的用途是什么? ---图解

    recv_queue中的包大小,为内核的包大小,而不是ip包大小. 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制. 多进程必须在sock ...

  10. C开发之----#if、#ifdef、#if defined之间的区别

    #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code... #endif 它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会 ...