树状数组
Eirlys_North
这个作者很懒,什么都没留下…
展开
-
搞懂树状数组
引用请注明出处:http://blog.csdn.net/int64ago/article/details/7429868 写下这个标题,其实心里还是没底的,与其说是写博帖,不如说是做总结。第一个接触树状数组还是两年前,用什么语言来形容当时的感觉呢?……太神奇了!真的,无法表达出那种感觉,她是那么的优雅,10行不到的代码,却把事情干的如此出色!没有了解她原理的前提下即使把转载 2016-10-29 07:12:39 · 428 阅读 · 0 评论 -
bzoj 3132 二维树状数组
题意:一个n*m初始为空的矩阵,资磁两种操作:(1)某个子矩阵的值都增加c (2)输出某个子矩阵的权值和用a[i,j]表示(i,j)~(n,m)的增量,则对于(1,1)~(x,y)的权值和ansans=sigma(a[i,j]*(x-i+1)*(y-j+1))(1 =sigma(a[i,j]*(x+1)*(y+1)-j*(x+1)*a[i,j]-i*(y+1)*a[i,j]+原创 2017-05-04 07:47:41 · 786 阅读 · 0 评论 -
bzoj 3155 树状数组
题意:对序列ai维护一个前缀和序列Si,再对Si维护一个前缀和序列Ti,支持两种操作:(1)修改ai的值(2)查询Ti∑((x - i + 1) * ai) = ∑( (n - i + 1) * ai ) - (n - x) * ∑ai分别用两个树状数组维护var n,m :longint; i原创 2017-04-16 16:01:07 · 422 阅读 · 0 评论 -
bzoj 3333 树状数组+线段树
题意:给定一个序列,每次选择一个位置,把这个位置之后所有不大于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数对于我们每次选择的位置p,无论怎么操作,都不会对位置p之前的数的逆序对造成影响,也不会对[p,n]中大于a[p]的数的逆序对造成影响同时很容易发现,没进行一次操作逆序对数都是只减不增的所以我们能够得到一个结论:每次答案会减去参加重新的排序的数形成的逆序对数而且很容易原创 2017-04-16 15:13:11 · 404 阅读 · 0 评论 -
bzoj 2762 树状数组
题意:给出一些形如 ax+b(1)新加入一个不等式(2)删除一个不等式(3)询问当x=k时满足的不等式的个数对于每一个不等式,通过变形就可以得到使它成立的x的范围那么就变成区间修改,单点查询,树状数组维护就好注意:(1)讨论a=0、a>0、a (2)由于k有非正数,所以要加上10^6+1,树状数组的范围也改为2*10^6+1,而由于满足不等式条件的x原创 2017-04-16 14:54:02 · 425 阅读 · 0 评论 -
bzoj 1935 && bzoj 4322 离线+树状数组
题意:给定n个点,多次询问某个矩阵中包含多少点如果暴力二维树状数组的话O(nlogn*logn+mlogn*logn)复杂度原地爆炸那么我们就把二维树状数组通过一些方法变成一维,就能降下去一个log离线处理把所有的询问按照二维树状数组的套路拆成四个,分别把给定点的坐标和拆开后的询问按横坐标排序对于当前询问,把x小于等于这个询问横坐标的点都加入树状数组,在树状数组中询问小于等原创 2017-04-16 14:37:23 · 419 阅读 · 0 评论 -
bzoj 1878 树状数组+离线
题意:m组询问,求[l,r]中包含了多少种不同的权值离线+树状数组,还是原来的配方,还是熟悉的呆马...把询问按l从小到大排序,i指针从1到n扫,保证每种权值在[i,r]中第一次出现的位置在树状数组中赋为1,其余位置为0当i与当前询问的l重合时,当前询问的答案为[l,r]的区间和type rec=record l,r,num:longin原创 2017-04-15 22:23:08 · 508 阅读 · 0 评论 -
bzoj 1452 二维树状数组
题意:n*m的矩阵,两种操作:(1)修改一个格子的权值(2)求一个子矩阵中指定权值出现的次数对每种颜色维护一个二维树状数组var a :array[0..105,0..305,0..305] of longint; map :array[0..305,0..305] of longint;原创 2017-04-15 22:11:57 · 414 阅读 · 0 评论 -
bzoj 1106 贪心+树状数组 或 栈模拟
题意:n个数,各出现两次,当两个相同的数相邻时,这两个数同时消除,上方的方块同时下落且可继续消除满足条件的。每次可交换相邻的两个方块,求最少交换次数使得所有数全消除首先,对于一对相同的数中间有另一对的情况(即两对相同的数是嵌套关系),肯定要先消除另一对其次,对于一对相同的数中间有另一对中的一个的情况(即两对相同的数有交集),先消除哪个其实是一样的(把一对换到另一对外或把另一对换到这一对里是原创 2017-03-07 08:08:21 · 381 阅读 · 0 评论 -
bzoj 3038 树状数组+并查集
同bzoj 3211鬼知道为什么数列中的数不大于1e12,但是要用int64来存开根号的数 var n,m,op,l,r,c :longint; f :array[0..100010] of longint; a :array[0..100010] of int64;原创 2017-02-22 23:32:23 · 334 阅读 · 0 评论 -
bzoj 3211 树状数组+并查集
题意:1、询问[l,r]区间和2、修改[l,r]区间的delta:dalta[i] -> int(sqrt(delta[i]))思路:1、区间求和和区间修改我们可以考虑相应的数据结构:线段树或树状数组, 这里我们选择树状数组(毕竟树状数组常数小还好写=。=)2、开根号的性质:原创 2017-02-03 23:50:33 · 542 阅读 · 0 评论 -
bzoj 2743 树状数组+离线处理
题意:n朵花,c种颜色,排成一排。共有m组询问,每个询问给出一个区间[l,r],输出[l,r]中满足个数大于等于2的颜色数蛮经典的思想...首先,我们用膝盖想出了可能用来维护区间的数据结构:树状数组、线段树我们很容易想到一道智障题:输出[l,r]的花朵数,很显然,答案就是(r-l+1),也就是把每朵花赋值为1,维护一个傻乎乎的前缀和当然,我们需要借鉴这种智障的思想回归正题我原创 2017-02-14 10:41:18 · 376 阅读 · 0 评论 -
一维树状数组模板【pascal】
1、单点修改,区间查询Pascal:var n,m,tt,x,y :longint; c :array[0..500010] of longint; i :longint;function lowbit(x:longint):longint;begin exi...原创 2016-11-15 09:13:29 · 1038 阅读 · 0 评论 -
poj1195 二维树状数组【pascal】
二维树状数组模板=。=var tt,n,x,y,l,b,r,t,z:longint; i,j :longint; c :array[0..1025,0..1025] of longint;function lowbit(x:longint):Longint;begin exit原创 2016-11-15 11:42:43 · 541 阅读 · 0 评论 -
彻底搞懂二维树状数组
二、树状数组可以扩充到二维。 问题:一个由数字构成的大矩阵,能进行两种操作 1) 对矩阵里的某个数加上一个整数(可正可负) 2) 查询某个子矩阵里所有数字的和,要求对每次查询,输出结果。 一维树状数组很容易扩展到二维,在二维情况下:数组A[][]的树状数组定义为: C[x][y] = ∑ a[i][j], 其中, x-lowbit(x) + 1转载 2016-11-15 09:22:59 · 736 阅读 · 1 评论 -
POJ 2309 BST(树状数组)
我只想说,对于了解并且会树状数组的人来说,别以为换了个图我们就认不出来你是个树状数组=。=对于不太了解的,请见【转】搞懂树状数组var t,n,x :longint;begin read(t); while (t>0) do begin dec(t); read(n); x:=n-(n and原创 2016-10-31 19:37:20 · 381 阅读 · 0 评论 -
【Hdu 1556】 Color the ball (树状数组)
区间修改,单点查询可以用线段树做也可以用树状数组做为了练习树状数组,这里采用树状数组方法修改:向上修改,左端点+1,对于加多了的,右端点右面-1查询:向下求和,根据我们的变化单点查询就变成了求和var n,l,r :longint; i :longint; c原创 2016-10-29 21:29:53 · 414 阅读 · 0 评论 -
POJ 2352 Stars(树状数组)
线段树和树状数组都可做,但是一看这个星星的图,第一反应就是树状数组,相比之下,树状数组代码长度比线段树短、简单而且时间的常数小,并且针对这道题更容易所以,就当练习树状数组的模板输入数据的纵坐标按照升序已经排好序,所以可以按照x轴建立一维树状数组唯一要注意的就是输入的横坐标的范围是包含0的,所以要+1再进行操作就当练习树状数组的模板了原创 2016-10-29 07:59:06 · 361 阅读 · 0 评论 -
bzoj 3594 树状数组
题意:给定一个n个数的序列,可以最多任意选择k个区间并将区间内的数都加1,求操作后LIS的长度我们用f[i,j]表示前i个数被操作k次后LIS的长度f[i,j]=max(f[k,l])+1 (1三维偏序..用二维树状数组优化取max的过程注意:用二维树状数组第一维的上界是max(a[i])+k,,第二维不能是[0,k]而是[1,k+1]uses math;var原创 2017-04-25 14:29:17 · 550 阅读 · 0 评论