Super Mario HDU 4417 主席树区间查询

题意

给你n个数(编号从0开始),然后查询区间内小于k的数的个数。

解题思路

这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题。当然我们需要进行离散化,不只是那n个数,k也需要进行离散化。

详情看代码吧,有注释。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1e5+7;
struct node{int l, r, sum;
}t[maxn*40];
int root[maxn], cnt;
int a[maxn];
vector<int> v;
int n, m, tot;
int getid(int x) //离散化获取编号,从1开始
{return lower_bound(v.begin() , v.end() , x) - v.begin() +1;
}
void update(int l, int r, int pre, int &now, int pos)
{t[++cnt]=t[pre];t[cnt].sum++;now=cnt;if(l==r) return ;int mid=(l+r)>>1;if(pos<=mid) update(l, mid, t[pre].l, t[now].l, pos);else update(mid+1, r, t[pre].r, t[now].r, pos);
}
int query(int l, int r, int x, int y, int k1)
{if(r<=k1) return t[y].sum-t[x].sum; //如果第k1小大于r边界,那么这个区间内的出现的所有数都小于k1if(l==r) //如果到达叶子节点,那么需要判断这个点在这个区间内是否出现过。return t[y].sum-t[x].sum > 0 ? 1 : 0 ;int mid=(l+r)>>1;int sum=t[t[y].l].sum - t[t[x].l].sum; //计算左子树区间内的出现的数字的个数。if(k1<=mid)return query(l, mid, t[x].l, t[y].l, k1); //如果在左子树的话,需要进行递归。else return sum+query(mid+1, r, t[x].r, t[y].r, k1);//如果在右子树的话就需要加上左边区间内出现的数的个数。
}
void init() //初始化
{cnt=0;v.clear();
}
int main()
{int t;      scanf("%d", &t);for(int ca=1; ca<=t; ca++){init();scanf("%d%d", &n, &m);for(int i=1; i<=n; i++){scanf("%d", &a[i]);v.push_back(a[i]);}//离散化sort(v.begin(), v.end() );v.erase( unique(v.begin() , v.end() ) ,  v.end() );tot=v.size(); //tot记录去重之后数的个数。for(int i=1; i<=n; i++){update(1, tot, root[i-1], root[i], getid(a[i])); //建立主席树}int x, y, k;printf("Case %d:\n", ca);for(int i=1; i<=m; i++){scanf("%d%d%d", &x, &y, &k);x++; y++; //因为题目是从0开始编号的,所以对于询问我们要加1if(k<=0 && v[0]>0 || k<v[0]) //结果为0的情况printf("0\n");else if(k>=v[tot-1])//结果为所查区间的情况{printf("%d\n", y-x+1);}else {int tmp=getid(k);//因为我用的是lower_bound(),返回第一个大于或者等于的位置,if(v[tmp-1] > k)//如果不等于的话,范围需要缩小一个printf("%d\n", query(1, tot, root[x-1], root[y], tmp-1) );else printf("%d\n", query(1, tot, root[x-1], root[y], tmp) );}}}return 0;
} 

转载于:https://www.cnblogs.com/alking1001/p/11434041.html

Super Mario HDU 4417 主席树区间查询相关推荐

  1. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  2. HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)

    Super Mario 思路 区间查找问题,容易想到离线莫队,确实这题就是莫队,接下来我们考虑如何维护区间高度值问题. 既然是离线嘛,我们容易想到离散化和他挂钩,想想这题是否需要离散化,高度的最大值是 ...

  3. hdu4417(Super Mario)—— 二分+划分树

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

  4. Sequence II (HDU 5919)(主席树)

    Sequence II 题目大意是有mmm次询问,每次询问一段区间[l,r][l, r][l,r],从左到右,如果这个数是在这个区间第一次出现,则记录下其下标, 我们会得到一个新的数组,要求这个数组的 ...

  5. hdu 4417(线段树OR树状数组)

    题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...

  6. hdu 4417 划分树

    思路:二分枚举区间第k大.用划分树查找是否符合要求的高度. #include<iostream> #include<algorithm> #include<cstdio& ...

  7. 2016中国大学生程序设计竞赛(长春)Sequence II HDU - 5919 主席树

    传送门 文章目录 题意: 思路: 题意: 给一个长度为nnn的序列,每次一个询问[l,r][l,r][l,r],求其中数第一次出现的位置的中位数. 思路: 先考虑一下如何求区间内不同数的个数. 因为要 ...

  8. Super Mario(主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  9. hdu 4417 Super Mario 树状数组||主席树

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

  10. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

最新文章

  1. html网页中显示乱码的问题解决
  2. 安天移动安全发布“大脏牛”漏洞分析报告(CVE-2017-1000405)
  3. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)
  4. phpgif图片包_PHP生成GIF动态图片验证码
  5. spring3 的restful API RequestMapping介绍
  6. 初学编程者如何摆脱搭建开发环境的困扰?
  7. 自动化运维工具之Zabbix发现_自动注册及web页面状态监控(四)
  8. Jmeter工具使用-分布式架构和服务器性能监控解决方案
  9. notepad++正则表达式使用
  10. vs 错误error C2011:类型重定义的解决办法
  11. CUDA文件缺失解决方法——以cudart64_110.dll not found为例
  12. jQuery中的日期时间控件
  13. mina框架CumulativeProtocolDecoder.doDecode方法浅析
  14. python复数类型的虚部通过什么表示_Python小白必备知识:Python复数类型(complex)详解...
  15. 国产化操作系统安装OpenJDK Icedtea插件
  16. 灭火机器人C语言程序,- 一款基于STM32的智能灭火机器人设计
  17. 端游服务器文件转成手游,苦等三年,当年画面最好的端游终于要做成手游了!...
  18. 机器学习从入门到创业手记-2.1.1 线性回归与房价还涨么
  19. 关于腾讯云域名访问问题的几个可能解决方案
  20. redo和undo日志

热门文章

  1. Springcloud学习系列之Ribbon自定义负载均衡规则
  2. Spring Cloud Eureka详解
  3. spring中这些开发技巧真的太diao了
  4. synchronizedMap,synchronizedList与synchronizedSet
  5. python中 os._exit() 和 sys.exit(), exit(0)的用法和区别
  6. PHP与MySQL动态网站开发:第4版
  7. 一款基于SSM框架技术的全栈Java web项目(已部署可直接体验)
  8. 《C语言及程序设计》程序阅读——数组与指针
  9. js操作checkbox(复选框)的方法总结
  10. 一个老板向员工发的牢骚