
树状数组
文章平均质量分 84
cillyb
这个作者很懒,什么都没留下…
展开
-
lightoj1085 - All Possible Increasing Subsequences(树状数组)
给你一个数列,问你有几个递增子序列(单个数字也算一个)原创 2016-10-23 18:27:57 · 351 阅读 · 0 评论 -
Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)
题意:有n张牌,每张牌上有一个数,每次从牌顶取一张牌,如果这张牌是剩余牌中的最小值那么就把它扔掉,不然放到牌堆底,问多少次操作才能把牌扔光。思路:树状数组维护每个位置的牌是否存在,这样就能logn计算两个位置之间牌数,一共只有1e5个数,这样我们就可以从1开始枚举模拟(一开始开一个1e5的vector把每个数的下标存进去),如果存在这个数,就从当前位置把所有的这个数拿完,记录维原创 2017-07-15 15:15:43 · 413 阅读 · 0 评论 -
SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)
题意:n个数,m个询问,问区间[l, r]中有多少个不同的数。思路:树状数组:先将所有查询按区间右端点从小到大排序,如果一个数已经出现过就先把以前位置上的删掉然后在新的位置上插入,这样[l,r]中重复的就只计算了一次 。主席树:因为主席树同时维护好多树,所以可以在线上解决,思路与树状数组基本一模一样,如果这个数出现过,就在上次出现的地方删去,在这重新添加。树原创 2017-07-23 19:40:22 · 972 阅读 · 0 评论 -
HDU 4417 Super Mario(树状数组离线处理 or 主席树)
题意:给你n个数,m次询问,每次询问求[L, R]区间内小于等于h的数的个数。(n,m 思路:树状数组:要求比h小的,我们可以对hi和ai从小到大排序,每次都将比查询的hi小的插入树状数组或线段树,插完后询问,然后继续插入比hi+1小的,在询问........跟点击打开链接做法类似。主席树:跟求区间第k大做法一样,只需要修改一下query函数即可,类似线段树求区间和。原创 2017-07-23 21:28:05 · 602 阅读 · 0 评论 -
HDU 5877 Weak Pair (dfs 树状数组 || dfs序 主席树)
题意:给你一颗树,每个节点有一个权值,给你一个k,问你满足a[u]*a[v] 思路:做的时候看到u和v又是子树关系,想当然就是dfs序啦,然后变成a[v]树中点开),所以直接敲了dfs序+主席树。。其实这题有简单做法,我们可以在dfs整棵树过程中计算每个点作为儿子节点的贡献,贡献即为其祖先节点u, k/a[u] >= a[v]的个数。因此可以用树状数组维护从原创 2017-09-03 21:04:35 · 353 阅读 · 0 评论 -
HDU 5869 Different GCD Subarray Query (离线处理 树状数组)
题意:给你一个长度为n的数组,q次询问区间[L, R], 求区间内的所有子段的不同gcd值有多少种.思路:有个知识:固定一个数为右端点,区间所能形成的gcd最多有logn个。所以可以预处理出每个数为右端点所能形成的gcd,相同gcd取左端点靠右的。这样对询问的R排序就能离线处理,用树状数组维护即可。代码:#includeusing namespace std;c原创 2017-09-04 00:36:21 · 382 阅读 · 0 评论 -
HDU 5862 Counting Intersections(树状数组)
题意:给你n条平行x或y轴的线段,保证没有公共端点 没有覆盖,问有多少交点。思路:对所有线段按x坐标排序,将y坐标离散化,将水平线段拆成两部分,左端点一个,右端点+1一个, 枚举所有线段遇到水平线段的左端点,对应y坐标在树状数组中的值+1,遇到水平线段的(右端点+1)时,将其对应y坐标在树状数组中的值-1.遇到竖直线段时,查询其纵坐标区间的和,也就是条竖直线段能产生的交点的个数.原创 2017-09-15 13:48:50 · 383 阅读 · 0 评论 -
CodeForces 703D Mishka and Interesting sum(树状数组 区间异或)
题意:给你n个数,q次询问,每次询问求区间上出现偶数次的数 的异或和。思路:区间的异或实际上就是区间内出现奇数次的数的异或和(偶数次的异或后为0),但是现在要求的是出现偶数次的异或和,我们可以再异或一下区间内的所有不相同数,这样每种数出现次数都加了1,奇偶就交换了,求得的答案也就成了区间上出现偶数次的异或和,现在关键是怎么求区间内不相同的数的异或和,可以树状数组离线操作,每次原创 2017-09-24 23:33:34 · 614 阅读 · 0 评论 -
HDU 4777 Rabbit Kingdom(树状数组 离线)
题意:给你n个数,q次询问,每次询问求[L, R]中与其他任何数互质的个数。n, q 思路:首先预处理出每个数他左边和右边第一个与他不互质的位置pre, post.然后对询问按右端点排序。(点击打开链接)(1)对于刚加入点x,树状数组L[x]位置+1 把这个定义为左更新(2)对于所有R[i]=x的点,树状数组L[i]位置-1,i位置+1 把这个定义为右更新(原创 2017-09-26 17:23:16 · 341 阅读 · 0 评论 -
51nod 1711 平均数(二分 树状数组)
题意:给你一个长度为n的序列,问所有区间(n*(n+1)/2个区间)中第k大的平均数。思路:首先可以想到答案具有单调性,所以可以用二分,但是怎么二分呢?所以我们只要将所有的sum[i]-ans*i作为新数组,类似求逆序对一样的方法插入BIT,就能计算出满足>=ans的个数, 注意别忘了把0也插入进去。因为存在sum[l-1]-ans*(l-1), 还有k别忘了开long l原创 2017-09-29 15:21:47 · 397 阅读 · 0 评论 -
51nod 1533 一堆的堆 & Codeforces538F A Heap of Heaps(树状数组||主席树)
题意:现在有一个长度为n的数组 a1, a2, ..., an 。然后对于k从1到 n-1分别对该数组建k叉堆。现在要统计对于每一个k叉堆,里面有多少结点是不满足最小堆的性质的。即值比父亲的要小的结点有多少个。k叉堆的定义是这样的:数组的下标从1到n编号,对于某一个编号为v的结点,他的k个儿子编号是 k(v − 1) + 2, ..., kv + 1 (如果其中某些编号超出n,那些编号就不原创 2017-09-21 12:48:48 · 470 阅读 · 0 评论 -
Gym 101572G Galactic Collegiate Programming Contest(离线 树状数组)
题意:ACM比赛每个队伍的分数由(a, b)组成, a是做出题数, b是总罚时, 出题多的排名前, 相同题量罚时少排名前, 如果题量罚时都相同, 排名一样, 例如, (1, 1), (1, 1), (0, 0)三支队伍排名为1, 1, 2 现在有n支队伍, m个事件, 每个事件由(t, p)组成, 代表队伍t以罚时p做出了一题让你输出每个事件后, 队伍1的排名思路:先预处理出所有可原创 2017-10-19 22:35:04 · 610 阅读 · 0 评论 -
Codeforces Round #423 (Div. 2) E. DNA Evolution(树状数组)
题意:给你一个只包含'A', 'T', 'G', 'C'的字符串,q次操作,有两种操作:1 x ch : 将x位置改成ch2 l r e:e为一个长度不超过10的字符串,问eeeee....与字符串的子串[l, r]有多少个匹配的字符(先将e的开头和l对齐)思路:一共就4种字符,可以分别考虑每个字符,e长度最大才10,可以分别考虑不同长度的e。假设e长为len, 那原创 2017-07-13 12:21:04 · 403 阅读 · 0 评论 -
之江学院2017ACM 校赛 Problem J: qwb又偷懒了(树状数组)
Descriptionqwb最近在做一个群众收入统计。ta非常懒,以至于忘记了今天领导要来视察。所以急忙催下属去做统计。在接下来长度为n的时间里,每个单位时间都有事情发生,可能会发下以下两种事件:1)下属递交了一份调查报告,由于太匆忙,上面只有一个整数x,代表一个居民的收入。2)领导来视察了,领导会来询问,收入在区间[l,r]内的居民的平均收入,qwb需要给出回答。原创 2017-06-01 20:26:07 · 890 阅读 · 0 评论 -
CodeForces 652D Nested Segments(树状数组 离散化)
题意:给你N条线段,保证线段终点没有重复,求每条线段他包含多少条线段。思路:将线段按左端点排序,那么问题就变成了求这条线段之后的右端点比当前右端点小的线段有几条。这样就可以拿树状数组来做,先把每条边的右端点+1,每处理一个边,就把该边的右端点-1,那么树状数组中维护的就是该边之后的。query(r-1)就是查询当前边之后的边中右端点比当前右端点小的边数量。因为坐标比较大,所以需原创 2017-05-30 01:28:18 · 548 阅读 · 0 评论 -
hdoj 3015 Disharmony Trees(树状数组)
思路和poj1990一样,开两个树状数组,分别维护左右的数量和距离和。注意要使用long long。代码:#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5;ll tree_num[maxn], tree_dis[maxn];struct node{ int原创 2016-10-24 14:39:04 · 389 阅读 · 0 评论 -
poj 2299 Ultra-QuickSort(树状数组求逆序数)
求逆序数的模板题。讲用树状数组求逆序数不错的博客:点击打开链接注意需要离散化,ans需要用long long代码:#include#include#include#includeusing namespace std;const int maxn = 5*1e5+5;int tree[maxn], ra[maxn], n;struct node{原创 2016-10-16 20:36:33 · 469 阅读 · 0 评论 -
hdoj 1514 Stars(树状数组类似求逆序)
星星的层数就是该星星左下(包括正左和正下)的数量。每次读到一颗星星查询x的前缀和即为比自己小的星星数即层数,查完再update该点+1即可。原创 2016-10-16 23:28:31 · 473 阅读 · 0 评论 -
poj 3067 Japan(逆序数)
只是简单的求逆序数,还是re一次,wa一次。re注意的是两个岛各最多1000城市,所以路可以有1e6wa注意的是交叉点的数量可以很多,会超int。代码:#include#include#include#includeusing namespace std;const int maxn = 1e6+5;int x, y, n, tree[maxn]原创 2016-10-17 00:18:01 · 491 阅读 · 0 评论 -
poj 1990 MooFest(树状数组)
题意:N头奶牛每头耳背程度v,坐标x。两牛交流需要音量为distance * max(v(i),v(j)),求所有牛两两交流所需总和?思路:对耳背进行升序,一头一头的加入牛,这样加入每一头的时候,这头牛的耳背程度肯定是最大的。开两个树状数组,分别记录距离和牛数量。每次分别查询左右两边的牛数量和距离和。代码:#include#include#include原创 2016-10-19 23:59:18 · 406 阅读 · 0 评论 -
POJ 2182 Lost Cows (树状数组+二分 / 线段树 / 枚举)
给出n和每个数之前比它小的数有几个 需要输出原序列,最后一个数的真实值为a[N]+1将a[N]+1在序列中删去,更新a[i],那么第N-1个数的真实值为a[N-1]+1。做法很多,线段树,树状数组加二分或是枚举都可以。线段树代码:#include#include#includeusing namespace std;const int maxn原创 2017-03-14 23:38:08 · 949 阅读 · 0 评论 -
QDUOJ 37 帅气的HYC的珍珠(树状数组)
题目地址:点击打开链接帅气的HYC经常早晨去锻炼(多么好的习惯~。有一天,他看到一路上的露珠,心里便产生了一个问题:一路上假如有N棵草,每颗草上可能会有露珠,或者没有露珠。连续的露珠会和为一体(>=2),并变为珍珠。比如第1棵草上有露珠,第2棵草也有露珠。那么就会形成一个珍珠。第1棵草上有露珠,第2棵草有露珠,第3棵也有露珠,那么也会形成一个珍珠。相反,如果第1颗草有露珠,第2棵草原创 2017-04-03 13:49:23 · 691 阅读 · 0 评论 -
codevs 3289 花匠 (dp + 线段树)
题目描述 Description花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。具体而言,栋栋的花的高度可以看成一列整数h_1, h_2, … , h_n。设当一部分花被移走后,剩下的花的高度依次为g_1, g_2, … , g_m,则栋栋希望下面两个条原创 2017-04-19 21:03:09 · 386 阅读 · 0 评论 -
poj 3321 Apple Tree(dfs标号+树状数组)
很好的一个题,讲一个树通过标号,巧妙的转换成了树状数组。参考思路:点击打开链接思路很巧妙,我们通过自己来编号所有苹果,每个节点保存两个值,左值为本身,右值为其包含的所有后代中最大的编号我们可以通过搜索来进行编号,在编好号之后,我们可以知道,对于某一点而言,我们是先通过这个点搜完所有他的后原创 2016-10-28 19:52:40 · 713 阅读 · 0 评论 -
hdoj 2852 KiKi's K-Number(树状数组+二分)
要多次查询大于某个值得第k个值。所以可以用树状数组来维护这个容器,用二分来查询这个值。代码:#includeusing namespace std;typedef long long ll;const int maxn = 1e5+5;ll a[maxn], tree[maxn];int lowbit(int x) { return x&(-x);原创 2016-10-29 17:04:10 · 495 阅读 · 0 评论 -
hdu 5700 区间交(树状数组+二分)
题目地址:点击打开链接思路:对左端点进行排序,然后一边更新,一边查询。因为按左端点排序,所以左端点可以作为相交区间的左端点,然后可以根据是否被大于等于k次覆盖二分查找k个区间覆盖的最大的右端点。此时对应的区间就是这个左端点能得到的最大区间。枚举完左端点后得到的就是最大值了。代码:#include#include#include#includeusing原创 2017-03-14 23:52:41 · 537 阅读 · 0 评论 -
51nod 1290 Counting Diff Pairs(莫队+树状数组)
题意:一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[j]中,有多少对数,abs(A[i] - A[j]) (2 思路:看到询问区间内满足条件的对数,容易想到莫队,条件是abs(A[i] - A[j]) 代码:#includeusing namespace std;typedef lon原创 2017-10-24 18:39:50 · 469 阅读 · 0 评论