树状数组小结(1)

树状数组其统计量的变化,可以动态删除区间,更新区间,更新节点,区间统计,单点求值。大部分题的代码在博客中有。
利用对和的二分,可以快速的求解第K大。
主要注重问题的转化和应用。
1.hoj 2275 Number sequence 
利用树状数组来统计个数,左边比他小的元素的个数,顺序将元素的个数更新为1,统计右边比他大的元素个数,可以逆序更新,取和求统计个数是动态过程。
2.Ultra-QuickSort
求逆序数,可先求正序数(和逆序相对的正常序列,自己定义的),即顺序统计,然后用总个数动态减去即可。
这题需要离散化,数据量过大,我做两个排序,一个是按左端点排序,一个是按读入的顺序标号排序。
3.POJ Stars
统计二维平面左下方的点数。是一维正序数的拓展,可以先对y轴排序,降维处理,然后就睡基础的一维正序数求法。
4.HOJ 2678 Stars
统计三维平面左下区间的点数。同理,可以先对z轴进行排序,降成二维来处理。二维的正序数统计是一维拓展。不过形式基本是一样的。
5.POJ 3067 Japan
逆序数的应用。先按x轴升序排列,若x相等按y升序。
6.POJ 2481 Cows
逆序数。
我的做法是起点升序排列,若起点相同则终点降序排序。
若两个点重合,传递答案的同时更新个数。
7.POJ 2029 Get Many Persimmon Trees
先枚举所有合法的矩形,利用树状数组统计矩形内的点数。
只需要统计矩形的四个角即可,二维树状数组的应用。
8.POJ 1195 Mobile phones
裸的二维树状数组。统计四个角。
9.POJ 2155 Matrix
这一题和以往的常用应用不同,是成段更新,单点求值。
武森的论文《浅谈信息学竞赛中的“0”和“1”》中给出一种解法和推导。用树状数组记录元素的修改量。
对于一维的情况,若要修改区间[x,y],只需要更新点x和y+1。
查询单点x时,求和sum(x)。
推广到二维的情况。
若要修改erwei区间[x1,y1]-[x2,y2]。需要更新矩形的四个角。
对[x2+1,y2+1],[x1,y1],施加正的更新量,对[x1,y2+1],[x2+1,y1],施加负的更新量。类似于韦恩图中重叠部分面积并的计算。
具体的推导还是建议去看原文中的描述。
10.HOJ 2686 Magic-Box
这道题的三维推广。
关键是寻找到立方体的八个点进行更新。
方式如出一辙。
11.HOJ_2430 Counting the algorithms
这是一个贪心,可以观察, 从外围开始删除不会影响到内部的操作,故从左到右或从右到左都是一样的。
这里用树状数组动态记录元素出现的个数。
若要记录一个元素,更新为1即可,若要删除,更新为-1。
计算距离时,扫描到x,快速获取和x相同的另一个元素的下标x`,直接做两点和之差即可。
12.POJ 2985 The k-th Largest Group
树状数组求第K大(小)。有个很简单的方法,就是直接用二分来逼近。
这题还可以用到并查集来处理集合,是裸的第K大求法问题。
13.HOJ 1016 Joseph's problem I
这题有一个很好的数学类解法。推导出母函数来直接求解,很高效。这边介绍一种更为普遍的模拟方法,用树状数组来模拟约瑟夫问题。
本题先预处理出要求的素数。然后每次新形成的环里下一个目标的间隔就是相应的素数。
在这里用树状数组来处理元素动态删除和在线统计间隔以快速确定下一个元素下标,这里用二分来逼近。
动态删除即将单点更新为-1,统计直接取和。
14.HOJ 2920 Escape
这道题和HOJ 1016 完全类似,不作赘述。


你可能感兴趣的:(数据结构,hoj,poj,树状数组,总结,ACM)