
数据结构-树状数组
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 1754 I Hate It(树状数组 | 线段树)
题目链接:hdu 1754 I Hate It题目大意:略。解题思路:方法一:树状数组,注意查询的时候,如果为一个的时候要与当前的数进行比较。#include #include #include using namespace std;const int N = 200005;int n, m, b[N], v[N];void add(i原创 2014-01-28 19:31:11 · 1316 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number(树状数组)
题目链接:hdu Minimum Inversion Number题目大意:给定一个序列,求该序列所有的循环序列中,逆序对数的最小值。解题思路:先预处理出原先序列的逆序对数,然后后面的循环序列都可以用o(1)的复杂度递推得到。#include #include #include using namespace std;const int maxn = 5005;#原创 2014-09-17 22:34:55 · 635 阅读 · 0 评论 -
poj 2481 Cows(树状数组)
题目链接:poj 2481 Cows题目大意:给定若干的区间,问说每个区间被多少个区间完全包含。解题思路:将区间按照区间左端点小的,右端点大的排序,然后扫描一遍,每次查询[r,maxn],然后在r处添加1。注意区间相同的情况,需要添加,但是不需要查询,直接和前一个的是相同的。#include #include #include using namespace s原创 2014-10-24 00:12:52 · 1014 阅读 · 0 评论 -
hdu 5101 Select(树状数组)
题目链接:hdu5101 Select题目大意:N和K,给定若干组数,要从从不同组中选出连个数和大于K,问说有多少种组成方案。解题思路:树状数组维护,将所有的数离散化掉对应成树状数组的下标,每次先计算一组,然后再将该组的元素插入到树状数组中。#include #include #include using namespace std;typedef long原创 2014-11-08 23:16:16 · 1080 阅读 · 0 评论 -
Codeforces 19D Points(树状数组)
题目链接:Codeforces 19D Points题目大意:N中操作,每次添加一个点,或者删除一个点,以及找到给定x,y坐标最近的一个坐标,并且保证xi,yi在x,y的右上角。解题思路:这题的解法还是很机智的。y坐标离散化,然后树状数组的每个单位用一个set代替,set记录的是点集。剩下的操作就像树状数组一样,每次添加就等于是+w的操作,移除就等于是-w,只是w是原创 2014-10-23 19:09:06 · 1113 阅读 · 0 评论 -
hdu 4777 Rabbit Kingdom(树状数组)
题目链接:hdu 4777 Rabbit Kingdom题目大意:一个兔子王国,有N只兔子,每只兔子有一个重量,如果两只兔子的重量不互质,那么就会干架,现在国王想将l r之间的兔子关进监狱,它想知道会有多少只兔子不会和别的兔子干架。解题思路:预处理出每只兔子的L,R表示向左和向右最近会与该兔子发生冲突的兔子,预处理的时候只要将每只兔子的重量分解成质因子后遍历两遍。对于询问,将询原创 2014-10-12 08:49:24 · 1898 阅读 · 0 评论 -
hdu 4456 Crowd(二维树状数组)
题目链接:hdu 4456 Crowd题目大意:给定N,然后M次操作1 x y z:在x,y的位置加z2 x y z:询问与x,y曼哈顿距离小于z的点值和。解题思路:将矩阵旋转45度,然后询问就等于是询问一个矩形,可以用容斥定理搞,维护用二维树状数组,但是空间开不下,直接用离散化,将有用到的点处理出来。#include #include #include原创 2014-11-17 23:13:57 · 1513 阅读 · 0 评论 -
hdu 4455 Substrings(树状数组+递推)
题目链接:hdu 4455 Substrings题目大意:给定一个长度为N的序列,现在有Q次询问,每次给定一个w,表示长度,输出序列中长度为w的连续子序列的权值和。序列的权值表示序列中不同元素的个数。解题思路:递推,先预处理处每个位置和前面相同的数据的最短距离P。dp[i]表示说长度为i子序列的权值和,dp[i+1] = dp[i] + v - c。v为[i+1~N原创 2014-11-17 23:25:13 · 1224 阅读 · 2 评论 -
poj 1195 Mobile phones(二维树状数组)
题目链接:poj 1195 Mobile phones题目大意:四种操作0 s:清空(1,1)~(s,s)1 x y a:在(x,y)点加上a2 x1 y1 x2 y2:询问矩形(x1,y1)~(x2,y2)的和。3:结束解题思路:纯二维树状数组。#include #include #include using namespace std;const int原创 2014-11-17 23:34:03 · 909 阅读 · 0 评论 -
hdu 3966 Aragorn's Story(树链剖分+树状数组)
题目链接:hdu 3966 Aragorn's Story题目大意:给定一个棵树,然后三种操作Q x:查询节点x的值I x y w:节点x到y这条路径上所有节点的值增加wD x y w:节点x到y这条路径上所有节点的值减少w解题思路:树链剖分,用树状数组维护每个节点的值。#pragma comment(linker, "/STACK:1024000000,1024000原创 2014-10-17 09:25:14 · 1231 阅读 · 0 评论 -
hdu 5147 Sequence II(树状数组)
题目链接:hdu 5147 Sequence II预处理每个位置作为b和c可以组成的对数,然后枚举b的位置计算。#include #include #include using namespace std;typedef long long ll;const int maxn = 50005;int N, arr[maxn], fenw[maxn], lef[max原创 2015-01-03 21:54:53 · 1367 阅读 · 0 评论 -
hdu 5372 Segment Game(树状数组)
题目链接:hdu 5372 Segment Game因为线段长度是递增的,不会出现后面的线段被前面的线段完全覆盖,所以只要分别计算[1,l-1]之间有多少个左端点,[1,r]之间有多少个右端点,想减即可。#include #include #include using namespace std;const int maxn = 2 * 1e5 + 5;#def原创 2015-08-12 22:53:52 · 854 阅读 · 0 评论 -
hdu 5406 CRB and Apple(树状数组+dp)
题目链接:hdu 5406 CRB and Apple将树按照高度从大到小排序,高度相同的美味值小的放前面。然后高度值就没有用了,等于说对得到的美味值序列求两个不相交的LIS,使得长度和尽量长。对序列元素离散化后,dp[i][j]表示说两个序列的终止位置分别为i,j的最大长度。从左向右考虑每个美味值,复杂度o(n)。对于一个值c,更新dp数组,枚举第一维状态i,复杂度o(n)。dp[i原创 2015-08-21 22:23:40 · 1531 阅读 · 0 评论 -
hdu 5324 Boring Class(树状数组+笛卡尔树 | 树状数组+cdq分治)
题目链接:hdu 5324 Boring Class做法一:树状数组套笛卡尔树。保证字典序最小,从N->1方向遍历。树状数组维护第二维,每个节点对应一棵笛卡尔树,笛卡尔树的key值对应第三维,val值为随机值,控制树高。然后笛卡尔树的每个节点维护len,idx,mlen,midx将每次查询复杂度控制在log(n) * log(n)#include #include #inc原创 2015-08-05 14:49:03 · 1087 阅读 · 0 评论 -
hdu 5465 Clarke and puzzle(二维树状数组)
题目链接:hdu 5465 Clarke and puzzle代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 505;#define lowbit(x) ((x)&(-x))int N, M, Q, A[maxn][maxn], fenw[maxn][m原创 2015-10-11 21:41:32 · 514 阅读 · 0 评论 -
hdu 4638 Group(树状数组)
题目链接:hdu 4638 Group代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define lowbit(x) ((x)&(-x))const int maxn = 100005;typedef pair<int,int> pii;int原创 2015-10-28 21:54:11 · 731 阅读 · 0 评论 -
uva 10909 - Lucky Number(树状数组)
题目链接:uva 10909 - Lucky Number题目大意:定义Lucky Number, 给定一个数n,输出有两个差值最小Lucky Number,x和y,要求x+y=n。解题思路:根据Lucky Number定义,用树状数组预处理出所有的Lucky Number,然后对于每个n,用二分找到最接近n/2的Lucky Number,然后去枚举。#include #in原创 2014-09-16 16:54:34 · 1439 阅读 · 0 评论 -
Codeforces 459D Pashmak and Parmida's problem(树状数组)
题目链接:Codeforces 459D Pashmak and Parmida's problem题目大意:给定一个序列,定义f(l,r,x)为l≤k≤r并且ak=x的k的个数,求1≤ij≤n的情况下,f(1,i,ai)f(j,n,aj)的个数。解题思路:预处理出f(1,i,ai),f(j,n,aj)值,然后用树状数组维护个数。#include #include #inc原创 2014-08-16 11:03:37 · 2465 阅读 · 0 评论 -
hdu 4031 Attack(树状数组)
题目链接:hdu 4031 Attack题目大意:有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后受到攻击,询问表示计算第a块墙受到攻击的次数,被防护罩抵消的不算。解题思路:树状数组,更新区间查询点,每次攻击区间a-b时,只要进行add(a,1); add(b+1, -1);然后第i堵墙受到的总攻击次数即为sum(i)。实原创 2014-01-29 00:28:43 · 1614 阅读 · 0 评论 -
hdu 1166 敌兵布阵(树状数组 | 线段树)
题目链接:hdu 1166 敌兵布阵题目大意:略。解题思路:树状数组的水题。这篇题解很好,适合初学树状数组的人。题解连接#include #include const int N = 50005;const int M = 105;int n, v[N];void add(int x, int val) { while (x <= n) {原创 2014-01-28 01:30:44 · 1566 阅读 · 0 评论 -
hdu 4217 Data Structure?(树状数组)
题目链接:hdu 4217 Data Structure?题目大意:给出n和m,表示有n个数1~n,然后每次从这个集合中挑选出第ki个小的(m次),问说挑选出来的数字的和。解题思路:树状数组,v记录的即为其区间上有多少个数未选取,进行取操作的时候只要找到第x个,使得前面的和刚好是ki即可。#include #include #include using原创 2014-01-28 23:13:01 · 1436 阅读 · 0 评论 -
Codeforces 387E George and Cards(二分+树状数组)
题目链接:Codeforces 387E George and Cards题目大意:给出一个长度为n的序列,然后在给出一个长度为k的条件序列,要求将原先的删除n-k个后得到的序列满足条件序列,条件序列b[i],表示序列的前i个元素中必须包含有b[i]这个数。删除操作,选取一个区间,删除中间的最小值,并且获得相应的区间长度的什么奖励,问说最多可以获得多少奖励(奖励啥看不懂)。原创 2014-02-01 22:26:38 · 1931 阅读 · 0 评论 -
Codeforces 383C Propagating tree(树状数组)
题目链接:Codeforces 383C Propagating tree题目大意:给出一颗有n个节点并一1为根节点的树,每个节点有它的权值,现在进行m次操作,操作分为添加和查询,当一个节点的权值添加val,则它的孩子节点的权值要添加-b。解题思路:首先通过dfs将树抽象成树状数组,然后以和根节点的层数关系作为d,开两个树状数组分别计算添加值和减少值。#incl原创 2014-02-07 18:00:46 · 2213 阅读 · 0 评论 -
Codeforces 390E Inna and Large Sweet Matrix(树状数组)
题目链接:Codeforces 390E Inna and Large Sweet Matrix题目大意:给出n,m和w,表示在一个n*m的图上进行操作,0表示添加操作,在点(x1,y1)和(x2,y2)之间的所有格子上添加value个糖果;1表示查询操作,查询(x1,y1)和(x2,y2)之间糖果的数量。解题思路:树状数组,将x,y分开讨论,bit1进行正常的添加操作,b原创 2014-02-13 21:06:06 · 1742 阅读 · 0 评论 -
Codeforces 396C On Changing Tree(树状数组)
题目链接:Codeforces 396C On Changing Tree题目大意:给出一棵以1为根的树,形式是从节点2开始给出每个节点的父亲节点;然后是m次操作,操作分为两种,1 v, x, k,表示在以v为根的字数上添加,添加的法则是看这个节点与v节点的距离为i的话,加上x-i*k;2 v查询节点v的值。解题思路:一开始以为很难,但是突然想到可以先加上在减去就豁然开朗了原创 2014-02-28 12:17:15 · 2023 阅读 · 0 评论 -
poj 2828 Buy Tickets(树状数组 | 线段树)
题目链接:poj 2828 Buy Tickets题目大意:给定N,表示有个人,给定每个人站入的位置,以及这个人的权值,现在按队列的顺序输出每个人的权值。解题思路:第K大元素,很巧妙,将人入队的顺序倒过来看,就是纯第K大问题,然后用树状数组还是线段树就都可以做了。C++ 线段树#include #include #include using namespace std;原创 2014-09-18 16:32:31 · 1429 阅读 · 3 评论 -
uva 12086 - Potentiometers(树状数组)
题目链接:uva 12086 - Potentiometers题目大意:给定n个整数,两个操作,S x y:把第x个数变成yM x y:计算第x个数到第y个数的总和解题思路:用num数组记录每个位置上的数,每次S操作则在树状数组上的x位置加上num[x] - y的值。#include #include #include using namespace std;原创 2014-08-25 14:05:12 · 1043 阅读 · 0 评论 -
uva 1428 - Ping pong(树状数组)
题目链接:uva 1428 - Ping pong题目大意:一条大街上住着n个乒乓球爱好者,经常组织比赛。每个人都有一个不同的能力值,每场比赛需要3个人,裁判要住在两个选手之间,并且能力值也要在选手之间,问说最多能举行多少场比赛。解题思路:预处理出bi和ci分别表示说在1~i中能力值比第i个人小的人和i+1~n中能力值比第i个人小的。处理过程用树状数组维护即可。#include原创 2014-08-24 23:28:12 · 1455 阅读 · 0 评论 -
uva 1513 - Movie collection(树状数组)
题目连接:uva 1513 - Movie collection题目大意:一个人喜欢收集电影,电影的碟子从小到大放好,现在给定他每次要看的电影编号,输出有多少个碟子在该电影的上端,每次看完一个将会放回顶端。解题思路:树状数组,用一个数组记录每个编号的电影现在所处的位置。然后用树状数组维护个数即可。#include #include #include using name原创 2014-08-25 14:12:10 · 1500 阅读 · 0 评论 -
hdu 4991 Ordered Subsequence(dp+树状数组)
题目链接:hdu 4991 Ordered Subsequence题目大意:给定一个序列,求有多少个子序列满足长度为m,并且递增。解题思路:dp[i][j]表示说选了以第i个数为结尾,长度为j的递增子串方案数。将每个数离散化后用树状数组维护即可。#include #include #include #include #define lowbit(x) ((x)&(-x原创 2014-09-10 10:53:13 · 1068 阅读 · 0 评论 -
uva 10869 - Brownie Points II(树状数组)
题目链接:uva 10869 - Brownie Points II题目大意:给定若干点,第一个人选中一个存在点的横坐标,第二个人选中该横坐标上的一点,以该点作原点建立坐标系,一、三象限的点属于第一个人,二、四象限属于第二个人,坐标轴上的不属于任何人。问说在第一个人获得点最多的情况下第二个人可能获得多少点。解题思路:将所有点按照x坐标从小到大,y坐标从大到小排序,这样从左向右可以处原创 2014-08-27 17:11:40 · 1141 阅读 · 0 评论 -
uva 11423 - Cache Simulator(树状数组)
题目链接:uva 11423 - Cache Simulator题目大意;模拟一个cache,4种操作:ADDR x:访问一个x地址RANGE x y n:访问x + y * k (0≤kSTAT:输出每个大小的cache,MISS的次数END:结束按照从小到大的顺序给cache的大小。解题思路:因为访问的次数不会大于1e7次,所以预先处理出访问的序列,然后对于每个原创 2014-08-27 17:04:45 · 1476 阅读 · 0 评论 -
uva 1406 - A Sequence of Numbers(树状数组)
题目链接:uva 1406 - A Sequence of Numbers题目大意;给定n个数,有两种操作:Q x:计算与2x取且不为0的数的个数C x:每个数加上x输出所有Q操作的和。解题思路:因为x最大为15,所以开16个树状数组,fenx[x]记录的是每个数取模2x+1的情况,然后有一个add值标记总共加了多少。根据add值确定原先数的范围。#include原创 2014-08-27 17:16:05 · 1282 阅读 · 0 评论 -
hdu 5517 Triple(二维树状数组)
题目链接:hdu 5517 Triple解题思路预处理出点,并且去重,重复点的个数用一个权值表示,这样点最多有1e5个,然后用二维树状数组做一遍。代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;type原创 2015-11-02 10:04:16 · 1301 阅读 · 0 评论