树状数组求第k小的元素
int find_kth(int k)
{
int ans = 0,cnt = 0;
for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般取lg(MAX_VAL)
{
ans += (1 << i);
if (ans >= maxn || cnt + c[ans] >= k)
ans -= (1 << i);
else
cnt += c[ans];
}
return ans + 1
}
首先树状数组c[i]里面存的是在i管辖的范围内各个组数的和,比如 1出现2次,2出现3次,4出现6次,那么a[1]=2,a[2]=3,a[3]=0,a[4]=6;故c[4]=11;
所以总的元素如下{1,1,2,2,2,4,4,4,4,4,4}。知道了a[]数组的含义后(a[x]表示x出现的次数),我们再来看看树状数组求和的过程:
假设我们要求sum[15] (a[1] + …… + a[15]),根据树状数组巧妙的求和运算,依次累加c[1111(二进制表示)],c[1110],c[1100],c[1000]
反过来看,利用二进制,从高位到地位确定当前位是1还是0,首先假设是1,判断累计结果是否会超过k,超过K则假设不成立,应为0,继续确定下一位。基于二进制最后可以确定第k小的数的数值。(注意:利用树状数组求第k小的元素的时候是根据总的元素的,例如上面举例的{1,1,2,2,2,4,4,4,4,4,4},而不是在a[1],a[2],a[3],a[4]中去寻求第k小,并且求第k小时候包含重复元素的数数,没有直接跳过重复元素,例如还是上面的例子第2小还是1。
树状数组求第k小的元素的更多相关文章
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...
- *HDU2852 树状数组(求第K小的数)
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- HDU 2852 (树状数组+无序第K小)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小 ...
- 树状数组求第K大(From CLJ)
; <<log2[n];p;p>>=) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;
随机推荐
- Oracle 常用操作【02】数据库特性
1. 导出 oracle 注释 -- 表明細+表注释+字段明细+字段注释 a.一个用户下的表明細+表注释+字段明细+字段注释 select ATC.OWNER, atC.TABLE_NAME, utc ...
- 生成 PDF 全攻略【1】初体验
经历过多少踩坑,翻看过多少类似博客,下载过多少版本的Jar,才能摸索出正确的代码书写方式,才能实现项目经理需求分析书中的功能点. 本文借一次 JavaEE 生成PDF的颠簸的实现过程,描述中小公司程序 ...
- canvas 2d 贴图技术实践
最近在公司内部的技术协会论坛里闲逛的时候,无意中发现了一篇手淘前端大牛岑安两年前写的博文,讲述了canvas的2d贴图技术.看到后觉得相当神奇.于是就自己实现了一下.不过岑安前辈的那篇博文也只是大概讲 ...
- Angular指令1
Angular的指令 也就是directive,其实就是一WebComponent,以前端的眼光来看,好象很复杂,但是以后端的眼光来看,还是非常简单的.其实就是一个中等水平的类. var myModu ...
- js的Array的map和sort实现方法
Array.prototype.mapA = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fu ...
- java 环境配置
'JAVAC' 不是内部或外部命令解决方法 'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. ...
- 2-ls 显示目录内容
ls list directory contents 显示目录内容 [语法]: ls [选项] [参数] [功能介绍] ls指令用来显示目录列表,在Linux系统中有着较高的使用率.ls指令的输出信息 ...
- Beta版本冲刺———第二天
会议照片: 项目燃尽图: 1.项目进展: 昨天的困难:分数排行榜的设计 今天解决的进度:完成了界面优化以及建立新的排行榜选项卡界面. 明天要做的事情:分数排行榜的功能设计 2.每个人每天做的事情 郭怡 ...
- PHP自学链接收藏
PHP之道 laravist Sublime Text 3
- 延时程序执行Qt
有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...