1. #include<iostream>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<stdio.h>
  5. #include<vector>
  6. #define LL long long
  7. #define rep(i,j,k) for(int i=j;i<=k;i++)
  8. #define per(i,j,k) for(int i=j;i>=k;i--)
  9. #define pb push_back
  10. #define pii pair<int,int>
  11. #define mp make_pair
  12. using namespace std;
  13. const int maxx = 1e5+;
  14. vector<int>v;
  15. struct node{
  16. int l,r,w;
  17. }tree[maxx*];
  18. int cnt;
  19. int root[maxx],a[maxx];
  20. int l[maxx],r[maxx],h[maxx];
  21. int getid(int x){
  22. return lower_bound(v.begin(),v.end(),x)-v.begin()+;
  23. }
  24. void inserts(int l,int r,int pre,int &now,int pos,int val){
  25. ///新建节点编号
  26. now=++cnt;
  27. ///拷贝并更新节点信息
  28. tree[now]=tree[pre];
  29. if (l==r){
  30. tree[now].w+=val;
  31. return ;
  32. }
  33. int mid=(l+r)>>;
  34. if (pos<=mid){
  35. inserts(l,mid,tree[pre].l,tree[now].l,pos,val);
  36. }else {
  37. inserts(mid+,r,tree[pre].r,tree[now].r,pos,val);
  38. }
  39. //维护区间数字的个数目
  40. tree[now].w=tree[tree[now].l].w+tree[tree[now].r].w;
  41. }
  42. int query(int pre,int now,int l,int r,int pos){
  43. if (l==r){
  44. //查询某个区间数字的个数,就是两个版本权值线段树个数的差值
  45. return tree[now].w-tree[pre].w;
  46. }
  47. int mid=(l+r)>>;
  48. if (pos<=mid){
  49. return query(tree[pre].l,tree[now].l,l,mid,pos);
  50. }else {
  51. return tree[tree[now].l].w-tree[tree[pre].l].w+query(tree[pre].r,tree[now].r,mid+,r,pos);
  52. }
  53. }
  54. int main(){
  55. int t;
  56. int n,m;
  57. scanf("%d",&t);
  58. int ca=;
  59. while(t--){
  60. ca++;
  61. printf("Case %d:\n",ca);
  62. cnt=;
  63. scanf("%d%d",&n,&m);
  64. v.clear();
  65. memset(root,,sizeof(root));
  66. memset(tree,,sizeof(tree));
  67. for(int i=;i<=n;i++){
  68. scanf("%d",&a[i]);
  69. v.pb(a[i]);
  70. }
  71. for (int i=;i<=n;i++){
  72. scanf("%d%d%d",&l[i],&r[i],&h[i]);
  73. v.push_back(h[i]);///注意为了防止出错,你需要同时离散高度,防止高度出现问题
  74. }
  75. sort(v.begin(),v.end());
  76. v.erase(unique(v.begin(),v.end()),v.end());
  77. int sz=v.size();
  78. for (int i=;i<=n;i++){
  79. int x=getid(a[i]);
  80. inserts(,sz,root[i-],root[i],x,);
  81. }
  82. for (int i=;i<=m;i++){
  83. int posc=getid(h[i]);
  84. l[i]++;
  85. r[i]++;
  86. if (posc==)printf("0\n");
  87. else
  88. printf("%d\n",query(root[l[i]-],root[r[i]],,sz,posc));
  89. }
  90. }
  91. return ;
  92. }

HDU 4417 Super Mario 主席树查询区间小于某个值的个数的更多相关文章

  1. HDU 4417 Super Mario 主席树

    分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...

  2. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)

    题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...

  5. HDU 4417 Super Mario ( 离线树状数组 )

    把数值和查询放在一起从小到大排序,纪录每个数值的位置,当遇到数值时就更新到树状数组中,遇到查询就直接查询该区间和. #include <cstdio> #include <cstri ...

  6. HDU 4417 Super Mario(划分树+二分)

    题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...

  7. A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)

    题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...

  8. HDU 4417 Super Mario(主席树 区间不超过k的个数)题解

    题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...

  9. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

随机推荐

  1. Lab2 内存管理(实现细节)

    lab2 中的变动 bootloader 的入口发生了改变 bootloader不像lab1那样,直接调用kern_init函数,而是先调用位于lab2/kern/init/entry.S中的kern ...

  2. Struts_改写客户列表练习

    1.CustomerAction修改放入ActionContext 2.list.jsp使用struts标签库

  3. git命令移动文件夹到另一文件夹

  4. pycharm最新激活码2017

    最新的2017激活码 BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZW ...

  5. 微信小程序--每个独立的page的page.json只能修改window属性

    app.json 配置项列表 app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. window配置 用于设置小程序的状态栏.导航条. ...

  6. PHPStrom直接在编辑器打开php文件

    以下是自己配置PHP+Apache的开发环境,集成环境的话要换第二种方法(看个人配置):PHPStrom 如果希望直接在编辑器打开php文件,要做以下这几步配置. 第一种:非集成环境 1 2 3 第二 ...

  7. R语言与显著性检验学习笔记

    R语言与显著性检验学习笔记 一.何为显著性检验 显著性检验的思想十分的简单,就是认为小概率事件不可能发生.虽然概率论中我们一直强调小概率事件必然发生,但显著性检验还是相信了小概率事件在我做的这一次检验 ...

  8. 【JZOJ3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)

    EVRT Bsny的书架乱成一团了,帮他一下吧! 他的书架上一共有n本书,我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31,31,32,那么混乱值为3:30,32,32,3 ...

  9. spring-cloud-zuul跨域问题解决

    问题发现 正常情况下,跨域是这样的: 1. 微服务配置跨域+zuul不配置=有跨域问题 2. 微服务配置+zuul配置=有跨域问题 3. 微服务不配置+zuul不配置=有跨域问题 4. 微服务不配置+ ...

  10. 2019-8-31-C#-循环的判断会进来几次

    title author date CreateTime categories C# 循环的判断会进来几次 lindexi 2019-08-31 16:55:58 +0800 2018-06-14 0 ...