树状数组
文章平均质量分 60
LbyG
脚踏实地
展开
-
hdu4638 Group(树状数组)
题目大意:给一个1-n的排列,然后询问[x,y]区间中有多少个连续的段。如给一个3 1 2 5 4, 查询是2 4,那么就是问1 2 5中有多少个连续的串,一共有两个串,1、2为一个串,5为一个串若查询是2 5,则问的是1 2 5 4中有多少个连续的串,一共有两个串, 1、2为一个串, 4、5 为一个串。 反思:这一题我想了蛮久的,因为我一直想要去维护每一个串的首个数字,但想了原创 2015-08-27 14:16:54 · 388 阅读 · 0 评论 -
树状数组求区间最大值
讲这个的博文已经不少了,但感觉不够详细不够通俗易懂,所以我尝试着更详细更通俗易懂的说一下我的理解。 这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。假设是要维护和查询区间的最大值(最小值将max改成min 就好了)这个算法和树状数组维护和查询区间和的方法很相似: 一、数组的含义1、在维护和查询区间原创 2015-09-04 10:42:56 · 25419 阅读 · 20 评论 -
poj 2299 Ultra-QuickSort(树状数组)
题目大意:给一串数字,问冒泡排序需要进行多少次交换 其实稍微模拟一下就可以发现,这一题其实就是要求逆序对的个数不过要解决一个问题就是:这些数组太大,难以用树状数组进行维护,可以用坐标离散化来做,因为每个数字都不相同,所以很好实现的我的离散化实现:sort(a+1, a+n+1);for (i=1; i<=n; i++) b[a[i].id] = i;其它的按照求逆序原创 2015-09-03 18:20:46 · 357 阅读 · 0 评论 -
POJ 2481 Cows (树状数组)
题目大意:给n个闭区间,求每个闭区间是多少个其他闭区间的真子集。 这一题先不考虑有相同闭区间的情况。i区间是j区间的真子集,则有Ej 所以可以将这个n个区间按照 “若Y大则大,若Y相同则X小的大” 的规则从大到小排序bool operator < (const cow &a, const cow &b){ if (a.y == b.y) return a.x < b原创 2015-09-03 12:25:56 · 315 阅读 · 0 评论 -
poj 1195 Mobile phones (二维树状数组)
题目大意:有一个S*S的数组。有两种操作:一、h[X,Y]加上A二、查询所有x1 这一题是一道二维树状数组的模板体。如果要查询(x1,y1,x2,y2)的值:只要查询query(1, 1, x2, y2) + query(1, 1, x1-1, y1-1) - query(1, 1, x2, y1-1) - query(1, 1, x1-1, y2)这个查询和维护可原创 2015-09-03 16:43:13 · 314 阅读 · 0 评论 -
poj 2352 Stars (树状数组)
题目大意:在一个平面上给n个节点。每一个节点的level为其左下方的节点个数(即xi >= xj, yi >= yj)求level为0、1、2、3.....、n-2、n-1的节点分别有多少个 (因为坐标有0,所以所有的横坐标都加一,否则可能进入死循环) 这一题最首先的想法是用二维树状数组,可是空间复杂度太大。因为问题是求左下方的节点数量,所以可以改用一维树状数组维护原创 2015-09-03 17:54:00 · 304 阅读 · 0 评论 -
poj3067 Japan (树状数组)
题目大意:左边有n个点,从上到下依次为1、2、3、......、n-1、n右边有m个点,从上到下一次为1、2、3、.......、m-1、m然后有k条路,分别连接左右两边的点。求这些路之间的交点有多少。每个交点至多被两条路径经过。 这一题的做法:这一题其实就是求逆序对的稍微变化。只要将k个路径按照:x大的大,若x相等则y大的大。代码:bool operator原创 2015-09-02 17:12:17 · 343 阅读 · 0 评论 -
poj 2155 Matrix(二维树状数组)
题目大意:有一个N*N的数组a,初始值为1分为两种操作:操作一:将所有满足x11,1->0操作二,询问a[x][y]是什么。 可以将反置变成所有区域每一个数都加一,最后将(a[x][y]%2)输出这一题是用二维树状数组更新区间、单点查询的题。对于操作一,进行如下维护:h[x1][y1] ++; h[x1][y2+1] --; h[x2+1][y1]--; h[x原创 2015-09-03 21:16:31 · 488 阅读 · 0 评论 -
hdu 1556 Color the ball (树状数组解决区间覆盖+单点查询)
题目大意:中文题目,就不说了。 这题的具体做法是:对于覆盖区间[a,b],让h[a] = h[a] + 1,h[b + 1] = h[b + 1] - 1。然后要查询x被覆盖了多少次,h[1]+h[2]+h[3]+......+h[x-1]+h[x]的值就是答案 我的代码#include #include #include using namespace std;原创 2015-09-02 16:24:15 · 388 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number (树状数组)
题目大意:给你一个1到n的排列(虽然题目是0到n-1的排列但加1一下就好了)如是a1、a2、a3、.......、an-1、an然后可以进行这样的操作:将第一个数放到最后,变成:a2、a3、a4、.......、an-1、an、a1每次这样可以得到n个不同的串。问这n个不同的串中,逆序对数最小的串的数量是多少。 这一题有一个关键的信息就是:这是一个1到n的排列利用这个信原创 2015-09-02 16:11:51 · 352 阅读 · 0 评论 -
hdu4267 A Simple Problem with Integers
题目大意:解释起来有些麻烦,直接贴一下英文版好了Problem DescriptionLet A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given number to a few numbers in a g原创 2015-08-27 21:29:13 · 338 阅读 · 0 评论 -
hdu 4777 Rabbit Kingdom(树状数组)
题目大意:给一串长度为n的数字a[],数字的取值范围是[1, 200000],然后询问一个区间内有多少个数字与区间内其他数字互质首先可以想到要处理出每一个数字a[i],他左右最近的不互质的数。做法是先预处理出[1..200000]中每一个数的质数因子,这个的时间复杂度是O(n+n/2+n/3+.....+n/(n-1)+n/n) = O(n*logn)具体代码:void PPre(原创 2015-08-19 20:46:32 · 364 阅读 · 0 评论