数据结构:树状数组(二叉索引树)
文章平均质量分 90
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
UESTC 1073 秋实大哥与线段树 线段树&&改值与区间和 or 树状数组
“学习本无底,前进莫徬徨。” 秋实大哥对一旁玩手机的学弟说道。秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构。为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作。秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值;一种是询问一段区间的和。Input第一行包含一个整数nn,表示序列的长度。接下来一行包含nn个整数aiai,表示序列初始的元素。接下来一行包含一个整数mm,表示操作数。接下来mm行,每行是以下两种操作之一:1 x v : 表原创 2016-03-10 23:11:54 · 1957 阅读 · 1 评论 -
UESTC 1583 曜酱的心意 树状数组求逆序数
题意:给出2个序列,问从一个序列到另一个序列需要的最少交换次数。树状数组求逆序数先读入ai,然后标记f[ai] = i;//1~n然后读入bi的时候,直接记录 x[i] = f[b[i]];然后对于x[i]数组,从后到前,依次_rank[i] = get[x[i]];add(x[i], 1);这样就可以求出所有的逆序数复杂度 O(nlogn)原创 2017-05-16 18:25:10 · 1452 阅读 · 0 评论 -
UESTC 1584 Washi与Sonochi的约定 树状数组+排序
题意:在二维平面上,某个点的rankrank被定义为x坐标不大于其x坐标,且y坐标不大于其y坐标的怪物的数量。(不含其自身),要求输出n行,每行一个整数,分别代表rankrank为0~n^1的怪物数量。树状数组+排序把所有的坐标读入之后,按照x为第优先级,y为第二优先级,都是从小到大排序,只从从0~n-1扫一遍,此时(i时)树状数组里的点的x值,都不比val[i].x大,//这题所有坐标都不同所以get(val[i].y)即可得到,所有x坐标不大于vali,且y坐标小于vali的坐标(点)的个原创 2017-05-16 18:18:47 · 1274 阅读 · 0 评论 -
UESTC 1551 Hesty Str1ng 后缀数组+树状数组、回文串
题意:给出一个字符串,要求选出子串A,然后自己搞一个长度小于A的子串B,把B接在A的后面,构成一个新的字符串T,要求T为回文串,求能构成的不同回文串的个数。后缀数组+树状数组、回文串刚开始的时候以为只是求不同子串的个数,匆匆忙忙就交了一发,果断wa了,自己还是太年轻了。然后发现,当选出的子串的末尾是以回文子串结尾时(确切的是以长度为偶数的回文子串,在化简一下其实是出现2个相同的字符(即最小半径了),因为更大的半径所产生的新的构造方法和最小的半径的回文子串产生新回文串的构造结果是一样的,当然这些也是原创 2017-03-27 13:24:39 · 892 阅读 · 0 评论 -
URAL - 2080 Wallet 树状数组+last数组
题意:给出一个数字序列,询问当前数字在本次与下次出现的区间里的 区间数字种数。树状数组+last数组具体见 UESTC 1342 郭大侠与甲铁城 树状数组+离线操作http://blog.csdn.net/prolightsfxjh/article/details/51287461原创 2017-02-07 20:06:31 · 629 阅读 · 0 评论 -
8VC Venture Cup 2017 - Elimination Round D. PolandBall and Polygon 树状数组+几何
题意:给出一个凸n边形,然后给一个k,存在gcd(n, k) == 1,然后从顶点x = 1开始,在x 与 y = x + k;//(while(y > n) y -= n;) 间画一条线,然后 x = y,继续 y = x + k 画线,没每画一条线图形中存在的中平面块数。树状数组+几何用ans表示画线前的平面块数,画一条xy线,则多出的平面块数为 线xy穿过的线的个数+1,观察可以发现,xy穿过的线段的个数等价于 顺时针方向 x与y之间点的权值和,(每个点的权值为点所在的线段的条数),然后考虑原创 2017-01-16 18:33:41 · 910 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线操作,树状数组,last[value],异或和
离线操作,树状数组,last[value],异或和首先,根据位异或的性质, 有一个结论:区间内所有出现次数为偶数的元素的异或和 == (区间内所有元素的异或和) ^ (区间内所有不同元素的异或和) 1、对于求 (区间内所有元素的异或和) 可以用 前缀异或和 2、对于(区间内所有不同元素的异或和), 则要用类似于求 区间不同的元素的个数 的算法 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 树状数组+离线操作先把所有询问储存下来, 然后原创 2016-09-16 23:17:16 · 644 阅读 · 0 评论 -
2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 树状数组+离线操作
树状数组+离线操作先把查询去区间储存下来然后按做端点排序每次查询一个区间, 必须按照前面留下的lastRight到到这个区间的右端点扫一遍, 如果当中有一个value上次出现的位置不在这里, 则把前面的value从树状数组中去掉, 去掉的时候用add(last[value], -1), 并更新last[value]。 把答案放在ans[maxn]里全部处理完在按照查询出现的顺序输出ans[i] = get(R) - get(L - 1);原创 2016-05-01 00:03:17 · 1224 阅读 · 0 评论 -
2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair 离散化+树状数组
离散化+树状数组把祖先节点的值 作为下标 插入的树状数组里, 即 val 的位置插入一个 1, add(val, 1), 然后到当前位置是 get(k / val) 就是 当前满足条件的祖先节点,回溯的时候把当前的祖先节点pop掉, 即 在 val 位置 插入 一个 -1 , add(val, -1) 这样 就可以维护成 树状数组里记录的 都是当前节点的祖先节点 也是 所有祖先节点。然后就是 val < 1e9, 直接使用 树状数组必然不行, 所以 我们 进行离散化, 把 n 个 val[i] 和原创 2016-09-11 02:24:28 · 1258 阅读 · 0 评论 -
2016 UESTC Training for Data Structures R - Japan 树状数组求逆序数
与2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化 那题很相似,不过这里不计左右边界上的点又因为这里(1≤M≤10000, 1≤N≤10000) 所以不用离散化,所以直接对右边排序如果a.vy != b.vy 则 return a.vy < b.vy如果a.vy != b.vy 则 return a.uy < b.vy uy小的往上拉,大的往下拉,这样在计算的时候就不会算到这个交点了原创 2016-05-01 00:04:37 · 1684 阅读 · 1 评论 -
2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列
树状数组+等差数列更的时候 Ax = A0 + (x-x0)*(-1)所以Ax求和并加上初始值就是新的val[x]了,这个最后加上初始值直接输出就行sum(Ax) = sum(A0+x0) - sum(x更新的次数)然后A0 + x0用一个树状数组维护,在更新点add(x0, A0+x0); 并在更新结尾的地方 add(x0+y0, -(x0+y0)),这样用树状数组地方get()的时候就不会对后面没有更新到的地方有影响了用另一个数组维护x出现的次数,在更新点add(x0, 1); 并在更新结尾原创 2016-05-01 00:04:00 · 1611 阅读 · 0 评论 -
2016 UESTC Training for Data Structures E - 卿学姐与城堡的墙 树状数组求逆序对、离散化
这样排序相当于把右边v上的交点也移到uv内部去了;所以已经处理成交点只在uv内部了然后for i = 1 ~ Nadd(seg[i-1].order, 1);ans += i - get(seg[i-1].order);扫完就可以输出了☺☺另外这里附上一个比较好的讲树状数组求逆序对原理的博客原创 2016-05-01 00:02:26 · 1504 阅读 · 0 评论 -
UESTC 1601 艾尔大停电2 二维树状数组+区间更新
题意:每次对一个矩形更新操作,单点查询,求该点被更新的次数。二维树状数组+区间更新用二维树状数组, get(x, y)表示 1,1到x,y这个矩形的面积或者说矩阵的元素和,所以对于读入的每个x1,y1,x2,y2。可以在 (x1, y1)这里插入一个1,然后为了抵消影响在(x2+1, y2+1)插入一个 -1,在(x2+1, y1)和(x1, y2+1)也插入一个-1,这就是树状数组区间更新的常用做法,推广到二维也是一样。这里如果查询x > x2+1, y > y2+1,的时候会有 k个1和3原创 2017-05-16 19:46:05 · 1517 阅读 · 0 评论