博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU2665_Kth number
阅读量:5080 次
发布时间:2019-06-12

本文共 1913 字,大约阅读时间需要 6 分钟。

给一个数组,求区间[l,r]中第k大的数。

今天被各种数据结构虐爆了,自己还是需要学习一下函数式线段树的,这个东西好像还挺常用。

函数式线段树的思想是这样的,对于每个时间状态,我们都建立一颗线段树,查询两个状态在某个区间的差的话,我们只要找到两个状态分别对应的点相减即可。

由于每次我使用线段树更新的时候,一路向下,所以我所涉及的更新的节点数量也只有log个,为了不改变原来的状态,可以选择新建这些节点。

这样所有的节点数量也不会超过n*log()个了。

对于此题,按照数组的顺序从左到右依次加入到线段树中,对于每个数组的位置都建立了一颗线段树,那么查找对于区间[l,r]的数字个数,我们只需要沿着两树的根节点一直往下面判断就可以了,每次判断两颗数的左二子数量相差是否大于K即可,也就是对于当前选择左走还是右走了,最终到达的点就是要找的那个第K大值了。

第一次使用 unique()和lower_bound(),内牛满面啊。 T_T !!!!! 

 

 

召唤代码君:

 

 

#include 
#include
#include
#include
#define maxn 22222222using namespace std;int L[maxn],R[maxn],sum[maxn];int N,n,m,T;int a[maxn],lisan[maxn],b[maxn],cnt;void build(int l,int r,int& p){ p=++N; sum[p]=0; if (l==r) return; int mid=(l+r)>>1; build(l,mid,L[p]); build(mid+1,r,R[p]);}void update(int pre,int& p,int l,int r,int x){ p=++N; L[p]=L[pre],R[p]=R[pre],sum[p]=sum[pre]+1; if (l==r) return; int mid=(l+r)>>1; if (x<=mid) update(L[pre],L[p],l,mid,x); else update(R[pre],R[p],mid+1,r,x);}int query(int u,int v,int l,int r,int k){ if (l==r) return l; int mid=(l+r)>>1,num=sum[L[v]]-sum[L[u]]; if (num>=k) return query(L[u],L[v],l,mid,k); else return query(R[u],R[v],mid+1,r,k-num);}int main(){ scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); N=0; for (int i=1; i<=n; i++) scanf("%d",&a[i]),lisan[i]=a[i]; sort(lisan+1,lisan+1+n); cnt=unique(lisan+1,lisan+1+n)-lisan-1; build(1,cnt,b[0]); for (int i=1; i<=n; i++) { int tmp=lower_bound(lisan+1,lisan+1+cnt,a[i])-lisan; update(b[i-1],b[i],1,cnt,tmp); } while (m--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); int pos=query(b[l-1],b[r],1,cnt,k); printf("%d\n",lisan[pos]); } } return 0;}

转载于:https://www.cnblogs.com/lochan/p/3861700.html

你可能感兴趣的文章
面向对象总结
查看>>
列约束
查看>>
Android学习网站
查看>>
[JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)
查看>>
使用RestSharp访问REST service
查看>>
Linux中 ./configure --prefix命令
查看>>
使用Spark进行搜狗日志分析实例——map join的使用
查看>>
windows server2008 64 asp.net 使用office组件环境配置.
查看>>
强化学习——Q-learning算法
查看>>
Python多线程编程(8): 线程的合并和后台线程
查看>>
asp:CustomValidator自定义验证控件的使用例子
查看>>
【转】Java内存管理
查看>>
mac虚拟机连接网络问题
查看>>
JAVA常见算法题(三十二)---找规律
查看>>
hadoop配置文件的加载机制
查看>>
正则表达式语法
查看>>
JAVA编程规范-代码格式规范
查看>>
[读码时间] 复选框选择
查看>>
css 点点加载demo
查看>>
【转存】身份证号检验详解与更正
查看>>