数据结构-树状数组
KIJamesQi
这个作者很懒,什么都没留下…
展开
-
hdu4217(求区间k小)
思路:求k小与k大本质上窝觉得是一样的,可以互相转换。http://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html这博客讲的还不错。/*****************************************Author :Crazy_AC(JamesQi)Time :2015File原创 2015-10-03 14:46:18 · 463 阅读 · 0 评论 -
Lightoj1267 Points in Rectangle (II)(排序+树状数组)
题意二维平面上给出p个点,然后q次讯问。每次讯问一个矩形内有多少个点落于里面,包涵边界。思路容易想到二维树状数组,但是空间炸了。可以降维处理,去掉x这一维。离散化y值,把所有点放在一起排序,每个点还有其编号、离散化后的y值、是否是询问矩形上的点、左下角还是右上角等信息。然后按照x的大小排序,剩下的看代码。const int MAXN =1e6 + 12;int p, q;struct po原创 2016-08-12 23:24:02 · 492 阅读 · 0 评论 -
spoj DQUERY - D-query(区间不同数的个数 主席树 or BIT)
题目链接 给出含有n个数字的序列,每次问区间[l,r]不同数的个数。 可以用主席树也可以用树状数组,做法都是同一个原理。从左往右扫一遍,记录每个数上一次出现的位置。当扫到i位置时, 把a[i]上一次出现的位置-1,i这个位置+1。然后对于所有询问区间[x, i]进行回答(BIT区间求和)。主席树也是这个原理, 只是要保存历史版本。const int maxn = 3e4 +原创 2016-08-21 12:20:49 · 962 阅读 · 0 评论 -
Lightoj1188 Fast Queries(树状数组离线)
题意给出n个数,Q次询问l,r表示数组l到r区间内有多少种数字。思路离线处理每个区间,把区间按照r的值从小到大排序。用vis[...]数组记录每个数前面出现的最近的位置。处理到位置i时,如果前面出现过a[i],那么把前面的那个位置清0,然后标记新的位置,再就是求前缀和了。。。const int maxn = 1e6 + 1234;struct Querys { int l, r, i原创 2016-08-02 22:55:53 · 518 阅读 · 0 评论 -
Lightoj1187 Lining up Students(树状数组)
题意有n个人,每个人有不同的身高,n个人站成一条线,每个人说出左边比自己高的人数,问最左边的人是第几高的。思路可以从最右边开始做,比如n = 10, a[n]=2,说明左边比他高的有5人,那么b[n] = 8;a[n-1] = 4,说明左边比他高的有4人,b[n-1] = 5,因为8出现在了他的右边,不能算在里面,这样就显然是二分+树状数组,因为线断树TLE了。/****************原创 2016-08-02 22:48:39 · 373 阅读 · 0 评论 -
codeforces 703D Mishka and Interesting sum (树状数组区间异或)
题意给出一个有n个元素的数组a[...], 1 <= a[i] <= 10^9,(n,m <= 10^6)。m次讯问区间[l,r]见出现了偶次的数的异或值。思路可以先求出1到i的异或值sum[i] = sum[i - 1] ^ a[i];树状数组部分有点同于求区间数的种数。last记录每个数前一次出现的位置。走到i时,如果a[i]出现过,那么把他上次出现的位置异或掉,再在i位置上异或上a[i]。原创 2016-08-05 10:10:33 · 844 阅读 · 0 评论 -
hdu3966Aragorn's Story(树链剖分+树状数组维护区间)
/*****************************************Author :Crazy_AC(JamesQi)Time :2016File Name :简单的树链剖分题*****************************************/// #pragma comment(linker, "/STACK:10240000原创 2016-03-28 23:46:55 · 429 阅读 · 0 评论 -
hdu4031 Atack(树状数组区间更新单点求值)
题意说有一个长为n的防御墙,有n个防御装置,每个防御装置能放单位一的长度范围,且每次成功防御后需要d的时间恢复防御能力,在这之间受到攻击是不具备防御能力的。现在有个武器每秒钟能够发起一次攻击,范围是[a,b]。然后问某个点没能成功防住攻击的次数。区间与点。。。。显然求成功防御的次数较简单点,然后由总的被攻击次数减之。首先需要纪录每秒攻击的范围,然后是点a从上一次攻击后回复防御能力的时间原创 2016-03-28 19:55:23 · 619 阅读 · 0 评论 -
hdu5101Select(树状数组求组合数)
这题不同于一般的求组合数的地方就是不能同班,所以在插入的时候就只能一个班整体的插入和整体的查询。/*****************************************Author :Crazy_AC(JamesQi)Time :2016File Name :*****************************************//原创 2016-03-29 14:32:52 · 374 阅读 · 0 评论 -
poj11195(二维树状数组)
思路:二为梳妆数组模版;题目给的操作就两个,更新区间值,区间求和;c[i][j]表示左上标为(0,0)右下标为(i,j)的正方形区间的和sum(i,j);明白sum(i,j)的意思之后呢,就知道中间某块矩形的和该怎么求了,可以参考下图;(1,2,3,4)的和 - (1,3)的和 - (1,2)的和 + (1)的和 = (4)的和;/*********************原创 2015-10-05 20:17:17 · 382 阅读 · 0 评论 -
uva10810(求逆序数)
由于num[i]比较大,所以要hash一下;然后就是树状数组的事情了;/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma com原创 2015-10-03 15:51:06 · 545 阅读 · 0 评论 -
Codeforces 652D(一维树状数组)
题目链接 有n根木棍,每根的范围是[li,ri][l_i,r_i],没有两个的rir_i是想通的,问每根棍子完全覆盖多少根棍子。 第i根棍子覆盖第j根棍子,必要条件就是li≤ljl_i \leq l_j &&rj≤ri r_j \leq r_i 。 那么按照l进行排序,l相同的r大的排在前面,然后从后往前扫。const int maxn = 2e5 + 10;struct seg原创 2016-09-19 16:40:46 · 657 阅读 · 0 评论