![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM-数据结构-树状数组
暗金色
这个作者很懒,什么都没留下…
展开
-
HDU - 3584 Cube(三维树状数组)
题目大意:给你一个3维的矩阵,初始化为0 两种操作 1 x1 y1 z1 x2 y2 z2:将(x1,y1,z1) (x2,y2,z2)这个矩阵内的数取非 0 x1 y1 z1:询问(x1,y1,z1)的值解题思路:三维树状数组的,跟POJ 2155相类似 更新的时候注意下就行了#include <cstdio> #include <cstring> const int N = 110;in原创 2015-10-16 22:50:31 · 517 阅读 · 0 评论 -
UVALive - 4329 Ping pong 二叉索引树
题目大意:有n个乒乓球队员,每个队员有相应的能力值.现在要由三个人组成比赛,组成比赛的规则是三个人,中间那个人的能力值要在旁边的两个人的能力值之间,问有多少种组队方法解题思路:二叉索引树,一个数组正序记录前面有多少个人能力值比当前这个人的能力值小,另一个数组记录后面有多少个人能力值比当前这个人的能力值小,然后用乘法规则#include<cstdio> #include<cstring> #defin原创 2015-03-24 21:02:24 · 581 阅读 · 0 评论 -
UVALive - 5902 Movie collection 二叉索引树
题目大意:有一个人有n个光盘,从下到上依次是n-1,现在给出操作m,意思是要把光盘m拿出来并放到最上面,并问操作前,关盘m上面有多少个光盘解题思路:用两个数组,pos数组纪录每个数所在的位置,t数组纪录这个数前面有多少个光盘将第n个放在第一个,第n-1个放在第2个,依此类推,然后更新t数组,这样的话,如果要求编号为m的光盘上面有多少个光盘,就可以直接用sum(maxn-1) - sum(pos[m]原创 2015-04-06 19:31:41 · 612 阅读 · 0 评论 -
POJ - 1195 Mobile phones(二维树状数组)
题目大意:给你一个N*N的矩阵,初始化为0 三种操作 1 x y c:将(x,y)的值加c 2 x1 y1 x2 y2:询问区间(x1,y1)到(x2,y2)的和 3: 结束操作解题思路:用二维树状数组可做 也可以一维的,分段维护下面只给一维的 一维的,分段维护#include <cstdio> #include <cstring> const int N = 1030; int原创 2015-10-16 22:44:21 · 421 阅读 · 0 评论 -
LightOJ - 1301 Monitoring Processes(树状数组)
题目大意:给你N个区间,问区间覆盖的最多次数解题路上:坐标比较大,得离散话,然后树状数组维护每个点被覆盖了几次即可,最后再取最大值#include <cstdio> #include <cstring> #include <map> #include <algorithm> using namespace std; const int N = 50010;struct Node { int原创 2015-11-06 22:40:45 · 630 阅读 · 0 评论 -
CodeForces - 396C On Changing Tree(树状数组)
题目大意:给一棵树,树上的点初始化是0,现在给出两种操作 1 v x k:v这个结点加上x,然后和v距离为i的所有子结点加上 x - (i * k) 2 v:询问v这个节点的值解题思路:先dfs处理出每个节点所包含的子孙结点的区域l和r,还有每个点的深度dep, 假设我Modify(l[v], x + k * dep[v])和Modify(r[v] + 1, -(x + k * dep[v])原创 2015-10-22 00:03:57 · 634 阅读 · 0 评论 -
CodeForces - 369E Valera and Queries(树状数组)
题目大意:给出N条线段,有M个询问,询问的内容是,k个点,共落在多少条所给线段上解题思路:这次参考了一下别人的题解。首先,很难直接从正面判断落在几条线段上,因为线段是会重叠的,且,有可能有多个点落在同一条线段上的 既然正面难以思考的话,那就用反面,判断一下有多少条所给线段会被不包含所有点的线段给包含在内,假设所给的点是1,4,7,那就判断[2,3],[5,6],[8,Max-1]这三个线段,共包含原创 2015-10-21 23:38:11 · 697 阅读 · 0 评论 -
HDU - 3333 Turing Tree(树状数组)
题目大意:给出N个数,M个询问,询问的是[a,b]区间内所有不相同的数的和解题思路:现在的问题是,怎么处理那些相同的数 我们可以一个个的修改树状数组,边修改,边求值,如果修改的位置刚好是询问的右边界,那就修改后,马上求值,所以要先对问题进行排序,右区间小的先询问 用一个数组纪录上一次相同数出现的地方 现在分两种情况: 一个是,该数之前没有出现过,那就直接修改树状数组,并记录该数所在的位置原创 2015-10-20 16:04:28 · 564 阅读 · 0 评论 -
HDU - 4267 A Simple Problem with Integers(树状数组)
题目大意:给你N个数,两种操作 1 a b k c: 表示对区间[a,b]内的所有满足(i - a) % k == 0的数加上c 2 a:第a个数是多少解题思路:三维数组,bit[i][k][j]表示第i个数,间隔为k,余数为j(因为要修改的是[a,b]区间中,所有满足间隔为k,且余数为a % k的所有数),所以用三维数组就可以全部区分出来了 每次修改的时候,只需要modify(a, k, a原创 2015-10-20 15:50:20 · 377 阅读 · 0 评论 -
POJ - 2352 Stars(树状数组求解逆序对)
题目大意:给你N颗星星的坐标,问每个等级的星星有多少颗解题思路:因为y是升序的,所以可以不考虑y了 求解星星所在的等级,其实就是求解前面有几个星星的x坐标是小于等于当前的x坐标的,也就是以该点为右端点的逆序对有多少个#include <cstdio> #include <cstring> const int N = 15010; const int M = 32010;int n; int bit原创 2015-10-16 22:40:08 · 365 阅读 · 0 评论 -
POJ - 2299 Ultra-QuickSort(树状数组)
题目大意:给你N个数,每次只能交换相邻的两个数,问至少需要交换几次,才能使数变成升序解题思路:需要交换的次数就是逆序对的个数,每交换一次,就相当于减少了一次逆序,而最后的升序,刚好逆序对是为0的,所以有多少的逆序对就要交换几次#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int原创 2015-10-16 22:36:00 · 427 阅读 · 0 评论 -
POJ - 2155 Matrix(二维树状数组)
题目大意:给你一个二维矩阵,刚开始初始化都为0 现在有两种操作 C x1 y1 x2 y2:将矩阵(x1,y1) (x2,y2)内的值取非 Q x1 y1:询问(x1,y1)这个数的值解题思路:二维树状数组 更新的时候要注意剪掉那些多的,画张图就知道了 传送门#include <cstdio> #include <cstring> const int N = 1010;int bit[N]原创 2015-10-16 22:47:44 · 367 阅读 · 0 评论