http://acm.hdu.edu.cn/showproblem.php?pid=4417

题意:找出给定区间内,有多少个数小于等于给定的数。用线段树维护的话会超时,要用到线段树的离线操作,对询问与数列都进行从小到大的排序,记录下标。从第一个询问开始,遍历数列,满足小于等于就插入到线段树中相应的位置。答案即为当前线段树中有多少个值。转换成了区间和,记录答案,最后一遍输出。

代码如下:

  1. #include<stdio.h>
  2. #include<algorithm>
  3. const int MAXN = 1e5 + ;
  4. using namespace std;
  5.  
  6. int n, m;
  7. int ANS[MAXN];
  8.  
  9. struct Node
  10. {
  11. int id, h;
  12. }node[MAXN];
  13. bool cmp1(Node a, Node b)
  14. {
  15. return a.h < b.h;
  16. }
  17.  
  18. struct Tree
  19. {
  20. int l, r, num;
  21. }t[MAXN * ];
  22.  
  23. struct Query
  24. {
  25. int l, r, limit, id;
  26. }q[MAXN];
  27. bool cmp2(Query a, Query b)
  28. {
  29. return a.limit < b.limit;
  30. }
  31.  
  32. void build(int l, int r, int k)
  33. {
  34. t[k].l = l, t[k].r = r, t[k].num = ;
  35. if(l == r)
  36. return ;
  37. int mid = (l + r) / ;
  38. build(l, mid, * k);
  39. build(mid + , r, * k + );
  40. }
  41.  
  42. void up_date(int id, int k)
  43. {
  44. if(t[k].l == t[k].r)
  45. {
  46. t[k].num = ;
  47. return ;
  48. }
  49. int mid = (t[k].l + t[k].r) / ;
  50. if(id <= mid)
  51. up_date(id, * k);
  52. else
  53. up_date(id, * k + );
  54. t[k].num = t[ * k].num + t[ * k + ].num;
  55. }
  56.  
  57. int query(int f_l, int f_r, int k)
  58. {
  59. if(f_l <= t[k].l && f_r >= t[k].r)
  60. return t[k].num;
  61. int mid = (t[k].l + t[k].r) / ;
  62. if(f_l > mid)
  63. return query(f_l, f_r, * k + );
  64. else if(f_r <= mid)
  65. return query(f_l, f_r, * k);
  66. else
  67. {
  68. return query(f_l, mid, * k) + query(mid + , f_r, * k + );
  69. }
  70. }
  71.  
  72. int main()
  73. {
  74. int T, k = ;
  75. scanf("%d", &T);
  76. while(T --)
  77. {
  78. scanf("%d%d", &n, &m);
  79. build(, n, );
  80. for(int i = ; i <= n; i ++)
  81. {
  82. scanf("%d", &node[i].h);
  83. node[i].id = i;
  84. }
  85. sort(node + , node + + n, cmp1);
  86. // for(int i = 1; i <= n; i ++)
  87. // printf("%d\n", node[i].h);
  88. printf("Case %d:\n", k ++);
  89. for(int i = ; i <= m; i ++)
  90. {
  91. scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].limit);
  92. q[i].l ++, q[i].r ++;
  93. q[i].id = i;
  94. }
  95. sort(q + , q + + m, cmp2);
  96. int j = ;
  97. for(int i = ; i <= m; i ++)
  98. {
  99. while(node[j].h <= q[i].limit && j <= n)
  100. {
  101. up_date(node[j].id, );
  102. j ++;
  103. }
  104. ANS[q[i].id] = query(q[i].l, q[i].r, );
  105. }
  106. for(int i = ; i <= m; i ++)
  107. printf("%d\n", ANS[i]);
  108. }
  109. return ;
  110. }

HDU 4417 【线段树+离线处理】的更多相关文章

  1. J - Super Mario HDU - 4417 线段树 离线处理 区间排序

    J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...

  2. hdu 4288 线段树+离线+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设 ...

  3. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  8. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. 装饰者模式(Decorator)---结构型

    1 基础知识 定义:在不改变原有对象的基础上,将功能附加到对象上即动态地给一个对象添加一些额外的职责.特征:提供了比继承更有弹性的替代方案. 本质:动态组合. 使用场景:扩展一个类的功能或给一个类添加 ...

  2. 初入SG-UAP

    初入SG-UAP SpriderMan 关注 2019.06.19 14:10 字数 1130 阅读 10评论 0喜欢 0 初次接触SG-UAP,将自己的见解以文字形式记录下来,希望能对初入的伙伴们有 ...

  3. 如何打开Mac OSX 终端的颜色

    如何打开Mac OSX 终端的颜色 听语音 | 浏览:8453 | 更新:2015-12-15 16:48 1 2 3 4 5 6 7 分步阅读 Mac 终端默认颜色很单一,文件夹和文件无法区分,可以 ...

  4. [Luogu] 树

    https://www.luogu.org/problemnew/show/P4092 树剖 + 线段树区间修改,单点查询 #include <bits/stdc++.h> using n ...

  5. STL中的BITSET运用

    胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...

  6. 数据结构实验之栈与队列一:进制转换(SDUT 2131)

    题目链接 题解: 特判一下n==0的时候. #include <bits/stdc++.h> using namespace std; int a[1000]; int main() { ...

  7. Maximum GCD(UVA 11827)

    Problem:Given the N integers, you have to find the maximum GCD (greatest common divisor) of every po ...

  8. 集合家族——ArrayList

    一.概述: ArrayList 是实现 List 接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些 ...

  9. Django基础之cookie

    1. Cookie 1.1 Cookie的由来 大家都知道HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 它不会受前面的请求响应情况 ...

  10. 使用python播放音乐

    1.首先安装pygame,pip install pygame 2.上代码: import time import pygame #音乐路径 filepath=r"C:\Users\1473 ...