
树状数组
文章平均质量分 68
ITCharge
高效率编程,慢节奏生活。
展开
-
NYOJ116 士兵杀敌(二)【树状数组】
题目大意:给你一个区间[1,N],每一个点上一个值。接下来是M条命令。QUERY X Y表示询问区间[X,Y]的和是多少。ADD X Y表示第X个点增加Y。思路:可用线段树或是树状数组来做。这次用树状数组试试。query(n);表示询问前n项的和。add(p,val)表示第p个点增加val。原创 2014-12-13 22:19:10 · 1006 阅读 · 0 评论 -
POJ1195 Mobile phones【树状数组】【二维】
题目大意:给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:命令1:1 x y w;将坐标为(x,y)处的点值增加w命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少命令3:3;不需要操作,退出。思路:二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。即ans = Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y原创 2015-05-14 12:52:11 · 743 阅读 · 0 评论 -
POJ3067 Japan【树状数组】【逆序数】
题目大意:有两排的城市,一排N个城市,编号为1~N,一排M个城市,编号为1~M。这两排城市之间有K条路。路都是直线连接,问:这些路,有多少道路是相交的,并且焦点不是城市所在的点,求出交点个数。思路:树状数组的思想。参考网上的图,先将所有边(u,v)按u升序排列,如果u相同,则按v升序排列。可以看出来,路(u1,v1)和路(u2,v2)如果有交点的话,u1 > u2 并且 v1 < v2,或者 u1 < u2 并且v1 > v2,为了不重复计算,忽略后一种情况。如果排序完之后,可以发现:结果就是原创 2015-05-13 22:22:35 · 927 阅读 · 0 评论 -
POJ2299 Ultra-QuickSort【树状数组】【逆序数】
题目大意:给你一个包含N个整数的序列,只能通过交换相邻的数字,最终变为升序顺序,问:最少需要多少次交换。思路:其实就是问冒泡排序的交换次数。其实就是求原序列的逆序数。用归并排序、线段树、树状数组都可以做。但是如果用线段树和树状数组来做的话,因为元素个数是500000,但是元素值范围却是999999999,需要先离散化。这里用间接排序的方法。用一个数组Arr[]存放原序列的值,另一个数组Id[]存放原序列编号(1~N),对Id[]按Arr[]元素值的从大到小排序,得到Arr[]数组元素的相对大小原创 2015-05-13 15:24:14 · 975 阅读 · 0 评论 -
HDU1541 Stars【树状数组】
题目大意:按顺序给你N颗星星的坐标,y是从小到大给出的。每个星星有一个等级,该等级为它左下角的星星的个数。求每个等级的点有多少个。思路:因为y是从小到大给出的,那么可以直接忽略y,只记录x,求出(x,y)左边有多少个点就可以了。用Ans[]数组表示每个等级的星星数。求(x,y)左边有多少个点用树状数组来做,每给一个点,就求出x左边的点个数。作为Ans数组下标,累加个数,最后输出Ans[]数组。原创 2015-05-13 13:32:59 · 1040 阅读 · 0 评论 -
树状数组【模板】
Tree[N] = A[N-2^k+1] + … + A[N] 单点更新,区间求值:树状数组代表区间的和。const int MAXN = 100010;int N,Tree[MAXN];int Lowbit(int i){ return i & (-i);}void Update(int i,int x){ while(i <= N) { Tree原创 2015-05-04 22:46:52 · 1191 阅读 · 0 评论 -
HDU3584 Cube【树状数组】【三维】
题目大意:给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。首先由A[i,j,k] = 0(1 <= i,j,k <= N)。给定两个操作:1:改变A[i,j,k]为!A[i,j,k]。2:查询A[i,j,k]的值。思路:三维树状数组区间更新、单点查询。更新区间(a,b)时,在 a 和 b+1 处都加1,前边表示增加1,后边是抵消加1操作,最后询问时,用Query(x) % 2 即为单点的值(0或1)。三维区间更新,要注意区原创 2015-05-13 12:38:05 · 1363 阅读 · 0 评论 -
HDU2642 Stars【二维树状数组】
题目大意:现在假设天空是一个二维平面(1000*1000)。坐标从(0,0)点开始。现在给出N条信息。"B X Y",B为字符,x、y是整数,表示将坐标(x,y)的星星变亮。"D XY",D为字符,x、y是整数,表示将坐标(x,y)的星星变暗。"Q X1 X2 Y1 Y2",Q是字符,X1、X2、Y1、Y2是整数,表示问有多少颗星星在X1、X2、Y1、Y2确定的矩形中。思路:建立一个二维的树状数组,单点更新,区间求值。其实和一维的差不多。只不过第i个元素变为了第x行第y列的元素。更新和求值原创 2015-04-28 17:28:31 · 1113 阅读 · 0 评论 -
HDU2838 Cow Sorting【树状数组】【逆序数】
题目大意:有N头奶牛排成一排。每头奶牛都有一个唯一的"坏脾气"值。坏脾气的范围为1~100000。现在将奶牛重新排序,使奶牛按照坏脾气增加的顺序排列。所有的奶牛都可以相互交换位置。但是交换脾气值为X,Y的两头奶牛,需要的时间是X+Y。现在问:将奶牛重新排列需要的最短时间是多少。思路:这道题就是给你一个N个元素的序列,求这个序列中所有逆序数的和。所以,对于值为a的第i个元素,除了知道前i个元素里比a大的元素个数之外,还得知道前i个元素里比a大的元素的和。建立结构体树状数组,一个变量来记录比a小原创 2015-04-28 17:05:42 · 950 阅读 · 0 评论 -
HDU2689 Sort it【树状数组】【逆序数】
题目大意:求把一个具有N个不同元素的序列通过交换两个相邻的元素转换成升序序列需要进行的交换次数是多少。例如:1 2 3 5 4,只需要交换5和4,交换次数为1次。思路:典型的求逆序数题。其实可以直接暴力过。但是用树状数组效率比较高。对于值为a第i个元素,需要交换次数为前i个元素中大于a的元素个数,即逆序数。用树状数组来做,数组Tree[i]表示数字i是否在序列中出现过,如果数字i已经存在于序列中,Tree[i] = 1,否则Tree[i] = 0。按序列从左到右将值为a的元素当作下标为a,原创 2015-04-27 23:02:09 · 929 阅读 · 0 评论 -
HDU1556 Color the ball【树状数组】【区间更新】
题目大意:N个气球排成一排,从左到右编号为1~N,给N组数据,每次给2两个整数s,e,表示从s到e将气球涂色。当涂到N次以后已经忘记了第i个气球被涂过几次颜色了。现在来计算出每个气球被涂了几次颜色,并输出出来。思路:典型的更新区间,单点求值问题。直接模拟会超时,考虑用树状数组来做。单点更新中,树状数组表示区间的和。在区间更新中,树状数组表示单个元素的变化。这道题中,区间(s,e)加1表示将s到e的气球涂色,先进行操作Update(s,1),表示将s~N个气球全部涂一次颜色,再进行操作Upd原创 2015-04-27 22:42:57 · 963 阅读 · 0 评论 -
NYOJ108 士兵杀敌(一)【树状数组】
题目大意:给你一个区间[1,N],每个点上有一个值,然后是M个询问。每次询问区间[X,Y]的和是多少。思路:虽然递推直接求前N项和,但是还是想用树状数组的方法做。注:query();询问前N项和原创 2014-12-13 18:23:22 · 1060 阅读 · 0 评论 -
HOJ1867 经理的烦恼【树状数组】
题目大意:有C家连锁店,编号1~C,有N条指令,每家店初始的商品数目都是M。接下来N行是命令。命令0:0 x w,连锁店x的商品数量变化为w,w > 0商品数量增加,w < 0商品数量减少。命令1:1 x y,询问编号区间为[x,y]的连锁店商品为素数的商店有多少家。思路:因为区间比较大,所以用树状数组来做。用一个数组Shop[]来存放每家店的商品数目,Tree[]表示树状数组。如果初始商品数量m是素数的话,则每家商店商品都为素数,遍历更新每家店。对于命令0,如果该店铺x的商品数Shop[x原创 2015-05-14 22:18:23 · 973 阅读 · 0 评论