离散化+线段树

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cmath>
  7. using namespace std;
  8.  
  9. typedef long long LL;
  10.  
  11. #define INF 0x7fffffff
  12. #define N 5000010
  13.  
  14. int n,m;
  15.  
  16. struct data
  17. {
  18. int l,r,k;
  19.  
  20. }a[N];
  21.  
  22. bool operator < (data x,data y)
  23. {
  24. return x.k<y.k;
  25. }
  26.  
  27. int b[N];
  28. int add[N],sum[N];
  29.  
  30. int ans=INF,cnt;
  31.  
  32. inline int getint()
  33. {
  34. int x=0,f=1;
  35. char ch=getchar();
  36. while (ch>'9' || ch<'0')
  37. {
  38. if (ch=='-')
  39. f=-1;
  40. ch=getchar();
  41. }
  42. while (ch>='0' && ch<='9')
  43. {
  44. x=x*10+ch-'0';
  45. ch=getchar();
  46. }
  47. return x*f;
  48. }
  49.  
  50. inline void pushup(int now)
  51. {
  52. sum[now]=max(sum[now<<1],sum[now<<1|1]);
  53. }
  54.  
  55. inline void pushdown(int now)
  56. {
  57. if (add[now])
  58. {
  59. sum[now<<1]+=add[now];
  60. sum[now<<1|1]+=add[now];
  61. add[now<<1]+=add[now];
  62. add[now<<1|1]+=add[now];
  63. add[now]=0;
  64. }
  65. }
  66.  
  67. inline void update(int nowl,int nowr,int now,int l,int r,int d)
  68. {
  69. if (nowl>=l && nowr<=r)
  70. {
  71. sum[now]+=d;
  72. add[now]+=d;
  73. return ;
  74. }
  75. pushdown(now);
  76. int mid=nowl+nowr>>1;
  77. if (l<=mid)
  78. update(nowl,mid,now<<1,l,r,d);
  79. if (r>mid)
  80. update(mid+1,nowr,now<<1|1,l,r,d);
  81. pushup(now);
  82. }
  83.  
  84. inline int get(int x)
  85. {
  86. int l=1,r=cnt,mid;
  87. while (l<r)
  88. {
  89. mid=l+r>>1;
  90. if (b[mid]>=x)
  91. r=mid;
  92. else
  93. l=mid+1;
  94. }
  95. return l;
  96. }
  97.  
  98. int main()
  99. {
  100. scanf("%d%d",&n,&m);
  101. for (int i=1;i<=n;i++)
  102. {
  103. scanf("%d%d",&a[i].l,&a[i].r);
  104. a[i].k=a[i].r-a[i].l+1;
  105. b[++cnt]=a[i].l;
  106. b[++cnt]=a[i].r;
  107. }
  108. sort(a+1,a+n+1);
  109. sort(b+1,b+cnt+1);
  110. for (int i=1;i<=n;i++)
  111. a[i].l=get(a[i].l),a[i].r=get(a[i].r);
  112. for (int i=1,j=0;j<=n;)
  113. {
  114. if (sum[1]>m)
  115. {
  116. update(1,cnt,1,a[i].l,a[i].r,-1);
  117. i++;
  118. }
  119. else if (sum[1]<m)
  120. {
  121. j++;
  122. if (j<=n)
  123. update(1,cnt,1,a[j].l,a[j].r,1);
  124. }
  125. else
  126. {
  127. ans=min(ans,a[j].k-a[i].k);
  128. update(1,cnt,1,a[i].l,a[i].r,-1);
  129. i++;
  130. }
  131. }
  132. printf("%d\n",ans!=INF ? ans : -1);
  133. return 0;
  134. }

  

【bzoj4653】[Noi2016]区间的更多相关文章

  1. [BZOJ4653][NOI2016]区间 贪心+线段树

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...

  2. BZOJ4653: [Noi2016]区间

    传送门 UOJ上卡掉一个点,COGS上卡掉两个点..弃疗,不改了,反正BZOJ上过啦hhh 先把区间按长度递增排序.然后每次用线段树维护区间最大覆盖次数,用一个指针随便扫扫就行了. //NOI 201 ...

  3. BZOJ4653 [NOI2016] 区间 【线段树】

    题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...

  4. 2018.08.17 bzoj4653: [Noi2016]区间(线段树+尺取法)

    传送门 将坐标离散化之后直接用尺取法(双指针)+线段树维护. 其实就是说只要目前所有点的被覆盖次数是大于等于m的就移动左指针删除区间更新答案,否则移动右指针加入区间更新答案. 话说忘记排序以及建树的时 ...

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

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

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

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

  7. 题解【bzoj4653 [NOI2016] 区间】

    先按照长度排个序,然后依次添加区间.什么是添加?设这个区间是\([l,r]\),添加就是把\(a_l,a_{l+1},a_{l+2},{...},a_{r}\)都加上\(1\),其中\(a_i\)表示 ...

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

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

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

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

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

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

随机推荐

  1. TOJ 2710: 过河 路径压缩

    2710: 过河  Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByteTotal Submit: 32         ...

  2. Quartz与Terracotta的集成

    Quartz与Terracotta的集成 博客分类: Java&Socket 企业应用面临的问题 开源组件的应用 quartz任务集群数据库任务调度Terracotta  Quartz与Ter ...

  3. HDU——1242Rescue(BFS+优先队列求点图最短路)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. [BZOJ1595] [Usaco2008 Jan]人工湖(单调栈)

    传送门 好难的题..至少对我来说. 这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展,每次找最近的最低的平台h,然后将水填到h高度. 栈里存的是向外扩展的时候,有时会遇到高度递 ...

  5. P1651 塔 (动态规划)

    题目描述 小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块.每个木块只能用一次,也可以不用 ...

  6. leetcode 144 先序遍历和中序遍历差不多

    这是只写了先序遍历的非递归代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode * ...

  7. uva 10090 二元一次不定方程

    Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...

  8. 标准C程序设计七---23

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  9. 树莓派学习笔记——I2C设备载入和速率设置

    原文:http://blog.csdn.net/xukai871105/article/details/18234075 1.载入设备 方法1——临时载入设备 sudo modprobe -r i2c ...

  10. Codechef Yet another cute girl

    题意大概就是让你求一下[L,R]中的约数个数是素数的数的个数. 其中1<=L<=R<=1e12,R-L<=1e6. 然后我写了两种做法,第一种是可以直接搞出来L-R的约数个数, ...