数据结构——树状数组/线段树
HARD_UNDERSTAND
Just try
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CodeForces 652D Nested Segments 树状数组
题意: 给你n个区间,问第i个区间有多少个子区间? 分析: 跟poj2481那题差不多,把区间看成是一个点,那么一个区间的子区间一定在它的右下方,即x比他的大,y比他的小的点。然后用树状数组搞下就好,因为题目范围是( - 1e9≤ li < ri ≤ 1e9) ,所以要离散化,因为每个区间的右端点都不一样,所以直接对y排序后离散化就可以。#include<iostream>#include<原创 2016-04-16 12:54:20 · 523 阅读 · 0 评论 -
hdu 3966 (树链剖分,树状数组/线段树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C的权值分析: 树链剖分入门题,基于点的重编号。 操作是区间增减原创 2016-10-08 11:58:33 · 518 阅读 · 0 评论 -
Codeforces 768B Code For 1 线段树思想
题目:http://codeforces.com/contest/768/problem/B题意:给一个数n,和一个区间[l,r] (r-l<1e5,n<2^50),每次可以把数n分成(n/2,n%2,n/2)知道所有数变成0或1,问区间内有多少个1?分析:因为[l,r]的范围小于1e5,所以想到枚举区间中的第pos个数,判断这个数是0还是1即可。递归去判断最多50,所以不会超时。递归如何判断呢?每原创 2017-02-22 22:01:55 · 964 阅读 · 0 评论 -
51nod 1391 01串【线段树,思维】
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1391题意:给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x < j, S[i..x]中0比1多,而S[x + 1..j]中1比0多。求满足条件的最长子串长度。 Input一行包含一个只由0和1构成的字符串S。 S的长度不超过100原创 2017-03-20 17:15:46 · 648 阅读 · 0 评论 -
51nod 1672 区间交【线段树、multiset】
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1672题意:小A有一个含有n个非负整数的数列与m个区间,每个区间可以表示为li,ri。 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。(具体可以参照样例)在样例中,5个位置对应的值分别为1,2,3,4,6,那么选择[2,5]与[4,5]两个区间原创 2017-03-21 18:28:55 · 330 阅读 · 0 评论 -
线段树入门题
发现窝的博客没有线段树模版题,于是乎摘抄一下《【完全版】线段树》单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来hdu1166 敌兵布阵 题意:O(-1) 思路:O(-1) 线段树功能:update:单点增减 query:区间求和hdu1754 I Hate It 题意:O(-1) 思路:O(-1) 线段树功能:update:单点替换 q原创 2017-08-27 23:45:49 · 572 阅读 · 0 评论 -
hdu 4747 Mex【线段树】
题目http://acm.hdu.edu.cn/showproblem.php?pid=4747题意给出一个序列,mex{}表示集合中没有出现的最小的自然数。然后 求sigma(mex (i , j)).分析在递推专题中看到这个题的,想了半天怎么感觉线段树可做啊,搜题解,果然线段树可做,递推做法有点神啊。copy的题解: 考虑左端点固定时的所有区间的mex值,这个序列是一个非递减了。。。首先要明白原创 2017-08-28 00:08:15 · 448 阅读 · 0 评论 -
spoj 375 Query on a tree(树链剖分,边,线段树)
题目:http://vjudge.net/contest/28982#problem/I 题意: 给一棵树,进行两种操作: 1.把第i条边权值改为x 2.查询a到b路径上的最大边权分析: 树链剖分入门题,基于边的重编号 操作:单点更新+区间查询最值 用线段树维护操作一篇很好的树链剖分的入门文章:http://blog.sina.com.cn/s/blog_69原创 2016-10-08 12:41:33 · 314 阅读 · 0 评论 -
fzu 2082 过路费(树链剖分,单点更新+区间求和)
题目:http://vjudge.net/contest/28982#problem/G 题意: 有n座城市,由n-1条路相连通,使得任意两座城市之间可达。每条路有过路费,要交过路费才能通过。每条路的过路费经常会更新,现问你,当前情况下,从城市a到城市b最少要花多少过路费。 分析: 树链剖分,基于边的重编号 操作:单点更新,区间求和 用树状数组或者线段树维护操作代码:#in原创 2016-10-08 16:01:23 · 450 阅读 · 0 评论 -
Codeforces 703D Mishka and Interesting sum 树状数组
题目:http://codeforces.com/contest/703/problem/D 题意: 给你n个数,m个区间询问 求区间出现次数为偶数次的数的异或和 分析: 如果是奇数次呢?我们知道a^a=0 所以直接前缀异或和就可以处理。所以思考有没有一种反异或运算呢?自己模拟一遍发现这样是错误的。换一个思路考虑,将奇数次变为偶数次来处理,只需要计算出所要查询的区间内不同的数的异或和a原创 2016-08-05 20:07:36 · 694 阅读 · 0 评论 -
hdu 5775 Bubble Sort 树状数组(多校)
题意:给出一个n个数(从1-n)的序列,经过冒泡排序后从小到大排列,问中间过程中,每个数到达的最右边和最左边的差值是多大? 例: 3 1 2 答案就是:1 1 2分析:考虑一个位置上的数字c在冒泡排序过程的变化情况。c会被其后面比c小的数字各交换一次,之后c就会只向前移动。数组从右向左扫,树状数组维护一下得到每个值右边有多少个比其小的值,加上原位置得到最右位置,最左位置为初始位置和最终位置的最原创 2016-07-30 15:31:40 · 499 阅读 · 0 评论 -
hdu 5877 离散化+树状数组 (2016大连网赛)
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 题意: n个节点的有根树,u是v的祖先,每个节点有个权值a[u].求 a[u] * a[v] <= k的有序对的数量。 分析: 这题一开始想到先求一下dfs序,然后把dfs序排列,二分找到每个结点的位置,然后在先前遍历找符合要求 的点,时间复杂度O(n^2),显然会超时~~原创 2016-09-11 10:56:30 · 297 阅读 · 0 评论 -
hdu 3333 离线+树状数组
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意: 求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。分析: 我们考虑每个查询[l,r],现在要求的是这个区间里不通数的和,所以我们在从左扫到右的过程中,可以用一个数据结构保存已经得到的不同的数,到右端点后,然后对区间里不同的数求和,这样就可以得到答案了。原创 2016-09-13 14:53:29 · 370 阅读 · 0 评论 -
hdu 5869 区间内不同的GCD数(离线+树状数组)
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 题意: 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量。分析: 这个题的本质和HDU 3333是一样的,HDU 3333要求计算区间内不同的数字有几个。 这题稍微变了一下,相当于原来扫描到i的之后是更新a[i]的情况,现在是更新log级原创 2016-09-13 15:04:25 · 772 阅读 · 0 评论 -
poj 2481 Cows 树状数组or线段树
题意: 给n个区间,问第i个区间是多少个区间的子区间。分析: 可以吧每一个线段看成是一个点,这样的话就等价于问一个点的左上方有多少个点?这样就和Stars那题一样了。 因为是求左上方有多少个点,那么把所有点按照y从大到小排列,这样就可以按照顺序求出0~x之间有多少个点,就是它左上方的点了。 需要重点的处理。树状数组:#include<iostream>#include<cstdio>#i原创 2016-04-16 10:35:59 · 266 阅读 · 0 评论 -
poj 2352 Stars 树状数组or线段树
题目大意: 在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y。如果左下位置有a个星星,就表示这个星星属于level x 按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量。分析: 因为输入是按照按照y递增,如果y相同则x递增的顺序给出的, 所以,对于第i颗星星,它的level就是之前出现过的星星中,横坐标原创 2016-04-16 09:52:37 · 312 阅读 · 0 评论 -
hdu 5919 Sequence II(主席树,求区间不同数的个数)
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意: 给定一个序列n,有m次查询,每次查询一个区间[l,r],求区间中每一种数在区间中第一次出现的位置的中位数,强制在线。分析: 主席树 利用主席树求区间不同数的个数k 然后寻找区间第k/2大 有个很好的办法,倒着插 即主席树维护后缀[i,n],然后对原创 2016-10-06 12:12:12 · 738 阅读 · 0 评论 -
hihocoder 1391 : Countries 北京网络赛(树状数组+离散化)
题目:http://www.hihocoder.com/problemset/problem/1391?sid=895605 官方题解: 分析: 我们可以预处理出导弹到达A的每个时间段,这样问题就转化成了求[x,x+TA]覆盖最大的时间段相应的代价和,这个范围内的导弹是可以防御住的,那么剩下的就是无法防御的。 所以用树状数组求解,时间的数据范围有点大,离散化一下即可。代码:using na原创 2016-09-27 23:15:50 · 521 阅读 · 0 评论 -
poj 2823 滑动窗口 单调队列/线段树
题意: 求滑动窗口中的最大值和最小值。 分析: 可以用线段树来做,建完树后,查询区间n-k+1次就行,每次查询O(1),时间复杂度O(n) 也可以用单调队列来做,比如求窗口中的最小值,那么就维护一个递增的队列,那么最小元素就是队首元素,每次右移,只要维护队列元素是递增的就可以。同样,求最大值,是维护一个递减的队列。#include<iostream>#include<cstdio>#in原创 2016-05-15 22:26:43 · 1242 阅读 · 0 评论 -
“玲珑杯”ACM比赛 Round #21 【线段树标记】
1164 - 战舰萝莉 DESCRIPTION 在大战之后,法力浮·鳝AK迅速驾船驶向北海。当然他知道水之灵不可能那么容易得到,正如爱迪生曾说过:“要把BOSS打倒就要准备足够的等级。”所以鳝氪金招募了一队海盗以防战斗。 果不其然,正当鳝看见了水之灵的所在时,一大队舰娘(雾),一大队舰船突然闪现,大战一触即发。 大战前,鳝被对面的boss——北方栖姬吸引了,北方栖姬是一个可爱的小萝莉,实力却原创 2017-09-24 21:19:19 · 242 阅读 · 0 评论
分享