序:
对于一个乱序的数组,我们搜寻它的中位数的常规方法就是排序。然而,在时间限制的情况下,排序显然不能满足我们的要求,因此我们这里引进树状数组。

几个套路

1.lowbit函数

用来搜寻一个数x的最低位1的位置,例如x=3时,转为二进制,lowbit(11)=1;又如x=6时,转为二进制lowbit(110)= 10;代码很简单:

#define lowbit(i) (i & (-i))

我们这里直接建立一个宏,快速计算,至于为什么是(i & (-i)),相信大家想想就知道了(虽然我也有点懵,但是我们不需要证明,拿来注意即可)

2.update函数

//update函数
void update(int x, int v)
{for(int i = x; i < maxn; i += lowbit(i)){c[i] += v;}
}

这里我们可以发现对于一个数x来说,v=1时表示增加,v=-1时表示删除该元素;再看看for循环,这里关键是i += lowbit(i),这里的遍历方法会让i逐渐变成2的次方,举个栗子:
若x=5时,转为二进制则为101,那么此时c[5] += 1
遍历后,x = 101+001 = 110, 那么此时c[6] += 1
再遍历后, x = 110+010 = 1000,那么此时c[8] +=1
后面就很规律了,c[2的k次方] += 1(k 大于等于4)

由这个update的操作,我们可以证明:
1.c[2的k次方]表示小于等于2的k次方的全部出现的数的总数
2.c[i],i不为2的次方,表示(最接近i的2的次方的sigma求和,i]全部出现的数的总数

因此,基于这个理解,我们就可以很好地解释下一部分。

3.getsum函数

//getsum函数(求小于等于x的数的总个数)
int getsum(int x)
{int sum = 0;for(int i = x; i >= 1; i -= lowbit(i)){sum += c[i];}return sum;
}

求小于等于x的数的总个数。
遍历的逻辑是逐渐将i逼近到2的k次方,具体来说就是每次解决i到i-lowbit(i)中所含数的个数,后续进行叠加,就可以得到1到x中小于等于x的数的总数了

3.getmedian函数

void PeekMedian() {int left = 1, right = maxn, mid, k = (s.size() + 1) / 2;while(left < right) {mid = (left + right) / 2;if(getsum(mid) >= k)right = mid;elseleft = mid + 1;}printf("%d\n", left);
}

简单二分,假设中位数为第k个即可。

练习:
可参见pat模拟栈

树状数组——快速定位中位数相关推荐

  1. 高级数据结构1—初识树状数组—快速求得前缀和和修改某一元素值

    - 本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~ 本人Gitee账号:路由器,欢迎关注获取博客内容源码.   树状数组和其他的高级数据结构不同,它非常的好写,同 ...

  2. [树状数组] Galahad

    题意:求给定区间内不同数的和 经典例题https://vjudge.net/problem/HDU-3333 解题思路: 这两天有点傻,emmm 离线操作 扫一遍数组 对于重复的值树状数组维护最靠近当 ...

  3. 树状数组 ---- 树状数组+动态维护前缀中位数 D. Omkar and Medians

    题目大意: 解题思路: 首先我们看他们的定义: bib_ibi​是a1,a2,a3,....,ai,ai+1,.......a2i−1a_1,a_2,a_3,....,a_i,a_{i+1},.... ...

  4. 【分解质因数】【树状数组】【快速幂】codeforces 2014 ACM-ICPC Vietnam National Second Round E. ACM...

    乘除都在150以内,分解质因数后发现只有35个,建立35个树状数组/线段树,做区间加.区间查询,最后快速幂起来. #include<cstdio> #include<cstring& ...

  5. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  6. 1097: 树状数组1(快速求和计算)

    1097: [视频]树状数组1(快速求和计算) 时间限制: 3 Sec 内存限制: 128 MB 提交: 231 解决: 109 [提交][状态][讨论版] 题目描述 [题意] 给出n个数,并且初始化 ...

  7. 快速求区间和的有趣算法——树状数组

    好久没写东西,感觉有写些什么的必要了.(高仿鲁迅) 树状数组虽然听起来名字高大上,但是不是很难(前缀和是名字高大上,却水得像海洋) 树状数组在单纯的查询一个区间的和和修改某一个数的效率要超过线段树哦! ...

  8. pat-1057 Stack 树状数组+二分查找

    题意 给我们一个n表示操作数量 然后三种操作 push和pop 还有求中位数的操作 让我们根据操作输出正确的解 分析 用sort排序做 或者 map标记法都会超时 考虑更快的方法 如何快速找到给定一串 ...

  9. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

最新文章

  1. python requests 爬取数据
  2. 这次被问懵了!搞定了这些SQL优化技巧,下次横着走
  3. java学习:理解abstract
  4. zabbix mysql 查询,Zabbix4.4配置MySQL监控;
  5. python对json的操作总结
  6. Session,Cookie,jsessionid,Url重写
  7. Android WebView https白屏、Http和Https混合问题、证书配置和使用
  8. 宁德时代考虑50亿美元在北美建厂 目标年产能最高80 GWh
  9. NUnit的使用中可能遇到的问题
  10. mysql中12e10等于多少_一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别...
  11. 儿童python编程入门-儿童编程python入门
  12. 2018年春季学期《软件工程》班级讨论群中开放性问题群聊记录
  13. 选择变色镜片——爱眼护眼
  14. Nuvoton M0518 之 看门狗的使用Demo
  15. 变量命名规范--匈牙利命名法,骆驼命名法,帕斯卡命名法
  16. pandas读取excel数据并对重复数据进行标记或者删除
  17. WLAN 无线二层组网,旁挂AC
  18. 关于opencv的实战——银行卡号识别
  19. 暑期学习与“懒人电商”项目经验总结
  20. pyqt5 日历设计 QSS

热门文章

  1. 《新手学黑客攻防》下载
  2. 温故而知新的知识蒸馏 Distilling Knowledge
  3. wyx20162314实验报告1
  4. 【历史上的今天】3 月 24 日:苹果推出 Mac OS X;微软前任 CEO 出生;Spring 1.0 正式发布
  5. java毕业设计健民中医药方网设计mybatis+源码+调试部署+系统+数据库+lw
  6. 浅谈运营商线路-----TDM、SDH、MSTP,OTN
  7. 现代控制理论(3)——线性控制系统的能控性和能观性
  8. 有意思的 lstrip 和 removeprefix(Python 3.9)
  9. find命令中参数perm的用法
  10. 图像处理 去模糊 去马赛克 软件