随笔分类 - 树状数组
摘要:这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你左上角和右下角的坐标,把这个长方形的区间所有元素反转一下,然后问某个具体坐标的值。 这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。//============================================================================// Name : 2012083101.cpp// Author : xind...
阅读全文
摘要:题目链接 逆序的概念大家都知道,一个数到逆序数就是该数左边大于它到数的个数。 很多没学过数据结构的人一上来肯定就是一个个数了,看看数据量500k,显然这种暴力的方法是行不通的。 我们换种想法,可以在输入过程中对每个数的逆序数求解,建一个vis数组(初始化为0),只要输入一个数,在它的位置标记为1,然后计算出它的左边一共有多少数被标记了就可以知道多少个数比他小了,当然逆序数也就知道了,求从左到右数的和,这是树状数组最擅长的了。 但我们看看每个数的范围是0 ≤ a[i] ≤ 999,999,999,我们不可能开那么大的数组,即使开的了也会浪费很多,这个时候我们就要对数据进行离散化处...
阅读全文
摘要:题意: 有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1开始的,使用在程序中要进行一定的处理。//LA 1112 - Curious Robin Hood(树状数组)//2013-04-13-08.22#include #include const int maxn = 100010;int a[maxn], b[maxn];int n;int lowbit(int x){ return x&(-x);}void update(int x, int
阅读全文
摘要:题目链接题意: 有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。思路: 我们只需要计算对询问的字符进行了多少次翻转,如果是偶数次,该字符变,否则翻转。对于区间的更新,我们可以使用线段树,不过对于这个题,因为只是对点的查询,而且每个节点的初始值都相同,为0,因此我们可以直接使用树状数组。下面是一个很巧妙的做法,而且很容易理解。用了树状数组的区间更新 单点查找(一般为单点更新 区间查找)例如 区间(2,4)加1则Updata(2,1) Updata(4+1,-1)实现了更新(2,4)的值而不改变其他值求Sum时即可得..
阅读全文
摘要:题目链接DescriptionAstronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. Astronomers want to know the distribution of the
阅读全文
摘要:题目链接DescriptionN (2 #include #include #define maxn 8005using namespace std;int a[maxn];int ans[maxn];int n;int lowbit(int x){ return x&(-x);}void add(int x, int v){ while (x 0) { s += a[x]; x -= lowbit(x); } return s;}int binarysearch(int l, int r, int x){ if (l == r...
阅读全文
摘要:由于英语极差,看了半天也没看懂题目,最后参考了其他人的题解才搞懂题目,我就直接把题意贴过来了 题意:这道题目只是题意自己就去理解了半天,大概题意如下:给出i一个n*n的矩阵,初始化为均为0,还有关于这个矩阵的几种操作,操作如下:命令1:(X Y A)对位于坐标(X Y)的值加A;命令2:(L B R T)求出位于L#include const int maxn = 1030;int n, a[maxn][maxn];int lowbit(int x){ return x & (-x);}void update(int i, int j, int v){ int t; w...
阅读全文
摘要:暴力超时,这道题可以用线段树做,因为更新的是单个节点,我们也可以用数组数组来做,我将两种方法的代码都给出 数组数组最适宜的用途就是区间求和和点的更新,但树状数组并不适用于区间的更新问题,也不是做不到,比较麻烦且难理解,有兴趣的可以看看这个http://blog.csdn.net/xindoo/article/details/8748410//树状数组#includeint n,ans[50005],f[50005];int lowbit(int n){ return n&(-n);}void add(int i,int v){ while(i #include #define...
阅读全文
摘要:本文扩写自郭神的《树状数组新应用》,在此表示膜拜。树状数组的学名貌似叫做BinaryIndexTree,关于它的基本应用可参考Topcoder上的这篇Tutorial.树状数组可以看作一个受限制的线段树,它维护一个数组,最经典的树状数组支持的基本操作有两个:(1)改变某一个元素的值(2)查询某一个区间内所有元素的和。在此基础上,经过简单的变形可以变成支持另一组操作:(1)把一个区间内所有元素都加上一个值(2)查询某一个元素的值。这两个都是已经泛滥了的东西了,在此不赘述。简单的树状数组模型是不支持这样一组操作的:(1)把某一个区间内所有元素都加上一个值(2)查询某一个区间内所有元素的和。当...
阅读全文
摘要:http://poj.org/problem?id=3928题目大意是一条大街上住着n个乒乓球爱好者,他们的水平高低用一个数值表示,他们经常举办比赛,比赛要三个人,一人当裁判。对裁判是有一定要求的,裁判的水平必须介于两选手之间且必须住他们中间,计算可以举办多少场比赛#include#include#define maxn 100005int c[20050]; //存放比比第i个人技能值低的人数 int xt[200050]; //树状数组int a[10050]; //存放每个人的技能值int ...
阅读全文

浙公网安备 33010602011771号