![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树状数组/线段树
xueerfei
wu
展开
-
Algorithm Tutorials Binary Indexed Trees (树状数组)
最开始学习树状数组的时候,翻遍了各种帖子,也把刘汝佳的入门经典196也翻了个N遍,可还是不怎么看的明白,无意中发现了这个教程,讲的嘛,反正我个人觉得非常好,自己水平一般,要不然看了N遍的帖子都不明白,但是感觉人家老外讲的真的非常的清楚,就翻译下吧。英文水平一般,翻译有误还希望大家批评指正。原文地址:http://community.topcoder.com/tc?module=Static&翻译 2013-09-22 22:06:05 · 2160 阅读 · 2 评论 -
杭电 3887 Counting Offspring
根据上篇翻译的文章以及很多个帖子,都讲述了树状数组最基本的功能就是tree[i]保存的是位置i左边小于等于a[i]的数的个数.这样也就可以解释代码中为什么有f[i]=getsum(sd[i-1])-getsum(st[i]))/2。因为getsum保存的就是左边比i小的数,注意因为序列是通过dfs求出的,因而每个节点都有进入和退出过程,也就是每个节点都出现了2次,比如说对于数4来说,有4个节点原创 2013-09-24 23:49:52 · 1127 阅读 · 0 评论 -
hdu 3030 Increasing Speed Limits(树状数组求最长上升子序列)
在前边关于DP总结的文章中说了通过普通的DP法个二分查找法求最长上升子问题,最近在学习BIT,然后突然发现原来通过BIT也可以求最长上升子序列问题。本来想着可以通过类似的方法在O(nlogn)时间内求出,然而题目的意思是求出总和,这样的话二分法就不好使了,一开始也没有理解,不过通过单纯的求最长上升子序列,终于搞明白了。先来看看求解普通的最长上升子序列问题:题目中首先将重复的元素去掉,以为我原创 2013-09-25 11:46:01 · 3699 阅读 · 1 评论 -
求第K小/大的数(树状数组解法)
求第K小/大数这个题目经常出现,面试,考试以及OJ上都有类似的题目。首先声明一点,个人觉得既然是第K小(大是一样的),那么重复的元素就不应该算了,当然如果算了就相对简单一些。。最原始的解法,快排,然后取第K个数。或者是构建一个小顶堆,遍历数组取最小的K个数,再然后还有所谓的快速选择,有人证明了可以在O(n)时间内解决,不过我不太清楚这种算法是否对重复元素有效(但看了代码其实就是快排的一种应原创 2013-09-25 23:05:50 · 7594 阅读 · 0 评论 -
求第K小/大的数(树状数组解法)【续】
上一篇文章讲了通过树状数组来求某个数组中的第K大/小的数。今天刚好看了一道实现挺巧妙的方法,也是用树状数组做的,不过这个算法前提是需要排序,即对数组进行序列化,这样就没有了对最大元素的值有要求了。其实基本思路是一样的,只不过上一篇文章中讲的的tree不是连续的,因此在需要在多一个flag数组标记。下面这个算法实现的时候将排序后元素的位置作为tree的值,这样保证了tree的连续性,实现起来也省原创 2013-09-27 20:22:11 · 2312 阅读 · 0 评论