树状数组
来源:互联网 发布:电吉他效果器软件ios 编辑:程序博客网 时间:2024/05/21 15:42
树状数组
关于树状数组的详细介绍可见刘汝佳《算法竞赛入门经典:训练指南》
对于一个n元素的数组A[n],可执行如下操作:
Add(I, d):让A[i]变成A[i]+d。
Query(L, R):返回A[L]+A[L+1]+…+A[R]。
注意:树状数组只能计算A[1]开始的和,A[0]这个元素是不能用的。上面操作复杂度都是O(logn)。
其实树状数组还可以处理区间更新,单点查询的问题。如HDU 1556 Color the ball,但是此类问题还是用线段树做比较直观。
下面是代码:
const int maxn=10000+5;//最大元素个数int n;//元素个数int c[maxn];//c[i]==A[i]+A[i-1]+...+A[i-lowbit(i)+1]//返回i的二进制最右边1的值int lowbit(int i){ return i&(-i);}//返回A[1]+...A[i]的和int sum(int i){ int res=0; while(i>0) { res += c[i]; i -= lowbit(i); } return res;}//令A[i] += valvoid add(int i,int val){ while(i<=n) { c[i] += val; i += lowbit(i); }}
注意,刚开始c数组要初始全0,然后每读入一个数A[i]就执行一步add(i, A[i])来进行真正的初始化。
且树状数组处理的数组A[n]是从小标1开始的,也即A[0]是一个没有用的元素。
树状数组:基本应用
HDU 1166 敌兵布阵(简单树状数组):基本应用。解题报告!
树状数组:标记数组,单点更新
UVA 1428 Pingpong(树状数组):基本题型,不过需要转换一下思维。解题报告!
POJ 2299Ultra-QuickSort(树状数组+离散化或归并排序求逆序):需要离散化数据然后用树状数组解决,但是用归并排序的思想更方便。解题报告!
POJ 2352HDU1541 Stars(树状数组):基本题型。解题报告!
POJ 2481 Cows(树状数组):基本题型,但是注意当两个节点完全相同时,但是我们又不能把相同的节点算入要求的节点数目里面时该怎么办?解题报告!
POJ 3067Japan(树状数组): 排序之后转化为求数列逆序数。解题报告!
HDU 1394Minimum Inversion Number(树状数组):依然是求逆序数。解题报告!
POJ 3378 CrazyThairs(数据集中+DP+树状数组+高精度):综合应用不过DP不难,数据集中不难,树状数组不难,高精度也不难。解题报告!
HDU 3450Counting Sequences(树状数组+DP+离散化):综合题,一步步拆解。解题报告!
HDU 3743 FroshWeek(树状数组或归并排序求逆序):又是一题求逆序的。解题报告!
HDU 2838 CowSorting(树状数组):很巧妙的思维。解题报告!
POJ 2182 LostCows(树状数组,暴力解法):暴力解法更好理解一点。解题报告!
POJ 1990MooFest(树状数组+离线处理): 需要一定的转换思维。解题报告!
树状数组:区间更新,单点查询
HDU 1556 Colorthe ball(树状数组):区间更新。解题报告!
树状数组:单点更新,删除元素
HDU 3874Necklace(树状数组+离线处理):需要巧妙的删除元素。解题报告!
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 【动态页面】(三)之一:利用Java反射机制读取Jar包的类名和属性名
- 浅谈服务器的运行流程
- 【动态页面】(二)Java反射
- own web security
- 长周期行业-航运(2)-航运公司再现倒闭潮
- 树状数组
- 《TCP/IP详解》读书笔记(22章)-TCP的坚持定时器
- 全排列递归算法与STL:next_permutation()函数
- 蓝桥杯——最短路
- CentOS 6.3下Samba服务器的安装与配置
- Android中的几种多线程实现
- Quartz.NET学习系列(十二)--- Quartz.NET集群
- Codeforces Round #293 (Div. 2)D.Ilya and Escalator——概率dp
- MongoDB数据访问[C#]