还是区间求和区间修改的问题,我们使用线段树解决以后发现编程复杂度比较大 在这里介绍一个简单的数据结构,树状数组。 树状数组的优势是编程复杂度小,常数小,时间复杂度也不错 树状数组的查询,修改,都是LOG(N)级别的 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,...
分类:
编程语言 时间:
2014-11-01 20:31:27
阅读次数:
229
POJ 2991 Crane
题目链接
题意:给定一个垂直的挖掘机臂,有n段,现在每次操作可以旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标
思路:线段树,把每一段当成一个向量,这样每一段的坐标就等于前几段的坐标和,然后每次旋转的时候,相当于把当前到最后位置全部加上一个角度,这样就需要区间修改了,然后每次还需要查询s,和s + 1当前的角度,所以需...
分类:
其他好文 时间:
2014-10-13 14:49:39
阅读次数:
272
UVA 12436 - Rip Van Winkle's Code
题目链接
题意:区间修改一个添加等差数列,一个把区间设为某个值,然后询问区间和
思路:关键在于等差数列的地方,线段树的每个结点添加一个首项和公差,由于等差数列加上一个等差数列还是一个等差数列,利用这个性质就可以进行维护了,注意set操作会覆盖掉等差数列的操作
代码:
#include
#includ...
题目大意:给定一个序列,提供下列操作:
1.将[l.r]区间内每个数a[i]变为sqrt(a[i])
2.查询[l,r]区间的和
根号是不支持区间修改的,于是我们选择单点修改区间查询的树状数组,但是这样是O(n^2)的,怎么办?
我们发现一个数x最多开loglogx次根号就会变为1 也就是一个int范围内的数只要开5次根号就会变为1 于是修改的总时间复杂度为O(nloglogn)
但是单...
分类:
编程语言 时间:
2014-10-10 16:03:44
阅读次数:
217
UVA1232 - SKYLINE(线段树区间修改)
题目链接
题目大意:按照顺序盖楼,如果这个位置(当前要盖的楼覆盖范围内)要新建的楼的高度>=之前就有的最大高度,那么就+1.最后输出这个+1的总数。
解题思路:线段树区间修改值,并且每次修改的时候返回修改的位置总数。因为可能左右子树的高度会有不同,所以这里加入一个sign来表示左右这一段是否高度一致。
代码:
#inc...
分类:
其他好文 时间:
2014-10-09 16:30:48
阅读次数:
279
题目大意:有一个全零的矩阵,有两个操作。
1.修改(x1,y1)到(x2,y2)的数,使它们取异或。
2.查询(x,y)的状态。
思路:二维树状数组,区间修改,单点查询。
CODE:
#include
#include
#include
#include
#define MAX 1010
using namespace std;
int cases;
i...
分类:
其他好文 时间:
2014-10-07 16:29:53
阅读次数:
164
UVA11992 - Fast Matrix Operations ( 线段树 + 区间修改 + 好题 )这是大白书上的例题,一直放着没有去A掉,这是一道线段树区间修改的好题。线段树中需要维护三个域 ,max, min, sum,也就是区间最大值,最小值,区间和题目大意:r 行 c 列 的全0矩阵,...
分类:
其他好文 时间:
2014-10-05 15:31:38
阅读次数:
192
题目链接:hdu 1828 Picture
题目大意:N个矩形,求矩形周长的并。
解题思路:利用到线段数区间合并,记录有多少个连续块,还用到区间修改,每次对于一条边,除了要计算竖直方向,还要计算水平方向,而水平方向是修改后的增减量。
#include
#include
#include
#include
#include
using namespace std;
con...
分类:
其他好文 时间:
2014-10-03 12:44:14
阅读次数:
197
UVA11992 - Fast Matrix Operations(线段树区间修改)
题目链接
题目大意:给你个r*c的矩阵,初始化为0。
然后给你三种操作:
1 x1, y1, x2, y2, v 把由x1,y1, x2, y2构成的子矩阵里的每个元素都加上v。
2 x1, y1, x2, y2, v 把这个子矩阵的每个元素都修改为v。
3 x1, y1, x2, y2 查询...
分类:
其他好文 时间:
2014-10-02 14:51:43
阅读次数:
244