![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-线段树
Rain722
这个作者很懒,什么都没留下…
展开
-
HDU1255覆盖的面积(线段树+离散化+扫描线)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 线段树求面积并升级版 题目大意: 被矩形覆盖过两次的地方的面积 来自大佬的分析:http://www.cnblogs.com/scau20110726/archive/2013/04/14/3020998.html 这题的代码在一般的线段树求面积并的基础上进行了修改,但是所用的原创 2017-03-16 17:04:39 · 1458 阅读 · 0 评论 -
HDU5861Road(线段树)
题意: 有n 个村庄在一条公路上,每两个村庄之间的路有使用和不使用两种状态,使用时,每天需耗费wi 元,每段路初始时都是不使用的,在m 天中,我们总共可以打开一次、关闭一次,从第一天到第m 天,每一天给出ai、bi,表示ai 到bi 之间的路必须是通的,问每一天n-1段路的总耗费最小为多少。 思路: 每段路只能打开一次,关闭一次,我们可以求出第i 段路最早什么时候使用原创 2017-09-22 11:33:58 · 282 阅读 · 0 评论 -
HDU4819 Mosaic(二维线段树)
题意: 给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l),求出该区域内的最大值(A)和最小值(B),输出(A+B)/2,并用这个值更新矩阵[x,y]的值 分析: 二维线段树的水题了。 对于二维的矩阵,需要查询一个区域的最大和最小值。 修改单个点的值。 二维线段树直接搞,主要是修改的时候,更新操作要往两个方向进行。 #include #include原创 2017-08-14 20:40:20 · 374 阅读 · 0 评论 -
Codeforces 383C Propagating tree(树状数组)
题目大意: 有一棵树,对这个树有两种操作:1:表示为(1 x val),在编号为x的节点上加上val,然后给x节点的每个儿子加上- val,再给每个儿子的儿子加上-(- val),一直加到没有儿子为止。2:表示为(2 x)查询x节点上的值。 思路: 首先通过dfs将树抽象成树状数组,然后以和根节点的层数关系作为d,开两个树状数组分别计算添加值和减少值。原创 2017-09-28 14:45:58 · 334 阅读 · 0 评论 -
Codeforce#424E. Cards Sorting(脑洞+树状数组)
E. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Vasily has a deck of cards consisting of n原创 2017-07-18 14:51:17 · 610 阅读 · 0 评论 -
HDU5892Resident Evil(二维树状数组+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5892 题意:给定n和m表示有一个n*n的矩阵和m个操作,操作1:给出左上角的位置[x1,y1]和右下角的位置[x2,y2],然后给定k表示有k对[a,b]接下来在这个给定的矩阵中每个格子中都添加b个a类物品;操作2:给定左上角位置[x1,y1]和右下角位置[x2,y2],求所有物品在这个矩阵中的奇偶原创 2017-05-16 15:51:26 · 435 阅读 · 0 评论 -
light oj1085All Possible Increasing Subsequences(树状数组+离散化+递推)
题意: 问你有多少个上升子序列。(题意很坑爹!) 分析:首先要离散化,因为数是int范围,而数最多时有1e5个。然后就是递推。类似于hdu5904的递推过程http://acm.hdu.edu.cn/showproblem.php?pid=5904 因为以一个数结尾的递增子序列只能来自上一个递增子序列的个数,即求所有以比结尾数小的数为结尾的子序列个数之和。(有点绕原创 2016-10-23 21:31:13 · 328 阅读 · 0 评论 -
POJ2155Matrix(二维树状数组)
给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少 注意树状数组是向上更新!! 比如: 1 2 2 C 1 1 4 4 Q 1 1 这样一组数据 那么矩阵里面是这样的 #include #include #include using namespace std; const int maxn = 1005; int C[m原创 2016-10-21 17:08:54 · 303 阅读 · 0 评论 -
树状数组经典
第01讲 什么是树状数组? 树状数组用来求区间元素和,求一次区间元素和的时间效率为O(logn)。 有些同学会觉得很奇怪。用一个数组S[i]保存序列A[]的前i个元素和,那么求区间i,j的元素和不就为S[j]-S[i-1],那么时间效率为O(1),岂不是更快? 但是,如果题目的A[]会改变呢?例如: 我们来定义下列问题:我们有n个盒子。可能的操作为 1.向盒子k添加石转载 2016-10-21 17:02:53 · 304 阅读 · 0 评论 -
POJ2481Cows(树状数组)
题意:就是给出N个区间,问这个区间是多少个区间的真子集。 分析:关键在于排序的策略。一边固定类型的题目。 #include #include #include #include using namespace std; const int maxn = 100005; int C[maxn], ans[maxn]; struct Cow { int low, high, index;原创 2016-10-20 21:48:42 · 305 阅读 · 0 评论 -
poj2299Ultra-QuickSort(树状数组+离散化)
算法的大体流程就是: 1.先对输入的数组离散化,使得各个元素比较接近,而不是离散的, 2.接着,运用树状数组的标准操作来累计数组的逆序数。 算法详细解释: 1.解释为什么要有离散的这么一个过程? 刚开始以为999.999.999这么一个数字,对于int存储类型来说是足够了。 还有只有500000个数字,何必要离散化呢? 刚开始一直想转载 2016-10-20 21:42:28 · 317 阅读 · 0 评论 -
POJ1990MooFest
题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i], v[j])*dist(i,j)的音量。应该说,题意是说,v[i]越小,听力越好。 求所有牛交谈时叫声总和∑(max(v[i],v[j])*abs(dist[j]-dist[i]) ) ) 思路:先对牛按照v从小到大排序。对于牛i,它与比他听力还小的牛之间交谈需要音量都是v[i],再乘以之间的距离就可以了。在排好序后,假设: c原创 2016-10-20 21:36:48 · 354 阅读 · 0 评论 -
POJ2352Stars(树状数组)
题意:按照y升序给你n个星星的坐标,如果有m个星星的x,y坐标均小于等于星星A的坐标,那么星星A的等级为m。 分析:是一道树状数组题。举例来说,以下是题目的输入: 5 1 1 5 1 7 1 3 3 5 5 由于y坐标是升序的且坐标不重复,所以在星星A后面输入的星星的x,y坐标不可能都小于等于星星A。假如当前输入的星星为(3,3),易得我们只需要去找原创 2016-10-18 21:49:38 · 334 阅读 · 0 评论 -
HDU3974Assign the task(DFS序+线段树)
/* translation: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。 有若干操作,分配给员工任务以及查询该员工正在执行的任务。 solution: 线段树,时间戳一般化 很明显该公司的所有员工间的关系可以用一颗多叉树来表示。然后就是dfs给这棵树打上时间戳。根据新分配的id号码 将其节点对原创 2017-09-22 11:27:58 · 272 阅读 · 0 评论 -
HDU1540Tunnel Warfare(线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。 分析: 线段树结点 设置一个 ll 记录区间左端点开始的最大连续个数, rl 记录区间右端点开始的最大的连续个数,ml表示该区间最大的连续点的个原创 2017-03-15 18:33:50 · 302 阅读 · 0 评论 -
ZOJ1610Count the Colors(线段树成段更新染色)
链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 题目大意: 在一条长度为8000的线段上染色,每次把区间[a,b]染成c颜色。显然,后面染上去的颜色会覆盖掉之前的颜色。 求染完之后,每个颜色在线段上有多少个间断的区间。 注意: 因为染色的是区间原创 2017-03-14 16:57:04 · 381 阅读 · 0 评论 -
hdu4027Can you answer these queries(区间更新查询+lazy)
题意:给一个数组序列, 数组长度为100000,现在有两种操作, 一种操作是将某一个固定区间所有数开方(向下取整),另一种操作是询问某个区间的所有数字之和。 一句话题解: 每个数最多才能被开方八次, 所以对于长度为n的数组,开方的次数最多为8*n。因为是向下取整,所以节约时 间的方法主要是处理被开方数为1的情况。 #include #include #include using nam原创 2017-03-14 13:35:49 · 342 阅读 · 0 评论 -
HDU2795Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张,选择贴海报的位置是:尽量高,同一高度,选择尽量靠左的地方。要求输出每张海报的高度位置。 一句话题解:用最底层的单个结点(也就是当tree[i].l==tree[i].r时的点)来表示高度的....... #inc原创 2017-03-14 12:47:10 · 353 阅读 · 0 评论 -
hihoCoder1116Calc(线段树区间合并)
描述 现在有一个有n个元素的数组a1, a2, ..., an。 记f(i, j) = ai * ai+1 * ... * aj。 初始时,a1 = a2 = ... = an = 0,每次我会修改一个ai的值,你需要实时反馈给我 ∑1 f(i, j)的值 mod 10007。 输入 第一行包含两个数n(1 接下来q行,每行包含两个数i, x,代表我把ai的值改为了原创 2016-11-05 20:45:07 · 402 阅读 · 0 评论 -
LightOj1080Binary Simulation(区间更新单点查询)
#include #include #include #include #include #include using namespace std; const int maxn = 100005; int C[maxn]; char a[maxn]; int lowbit(int lo) { return lo & (-lo); } void modify(int pos, int va原创 2016-10-23 21:35:22 · 379 阅读 · 0 评论 -
HDU4288Coder(线段树+离线查询)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意: 1:add x 就是把x插进去 2:delete x 就是把x删除 3:sum 就是求下标%5=3的元素的和。 题目要求插入和删除后都要保证数列有序 分析: 先读入所有的数据,离散化后建立线段树。在每个结构体中设立一个cnt变量用于原创 2017-03-15 18:48:35 · 404 阅读 · 0 评论 -
HDU1542Atlantis(线段树+离散化+扫描线)
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1542 首先附上大佬们的博客: http://www.cnblogs.com/scau20110726/archive/2013/03/21/2972808.html http://blog.csdn.net/xingyeyongheng/article/details/8927732#原创 2017-03-16 16:59:14 · 923 阅读 · 0 评论 -
HDU5475An easy problem(线段树单点更新)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2077 Accepted Submission(s): 853 Problem Description One day, a原创 2017-06-01 13:53:25 · 471 阅读 · 0 评论 -
HDU6070Dirt Ratio(二分+线段树)
来自大佬的讲解:http://blog.csdn.net/jerans/article/details/76651326 题目: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 定义一个区间的值为(不同数的个数/区间长度),求所有区间内的最小值 有一种01分数规划的思想,二分结果值now,这原创 2017-08-04 17:02:42 · 259 阅读 · 0 评论 -
Codeforces 833B - The Bakery(DP+线段树)
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Some time ago Slastyona the Sweetmaid dec原创 2017-08-06 15:25:39 · 383 阅读 · 0 评论 -
HDU5877WeakPair(线段树+离散化+DFS)
解题思路: 【题意】 给你一棵有根树,一个定值k,以及树上每个结点的值a[i] 对于有序对(u,v),如果(1)u是v的祖先,且(2)a[u]*a[v] 问树中有多少对有序对(u,v)是弱的 【类型】 离散化+dfs+树状数组 【分析】 对于要求(1),u是v的祖先,我们可以采取dfs 遍历到v时,它上方的所有结点必定都是满足第一条件的u原创 2017-08-25 19:15:43 · 494 阅读 · 0 评论 -
HDU1556 color the ball(树状数组)向下查询,向上统计
解题思路: 其实这道题可以把每次染色的点抽象为每次涂改的区间,然后对要查询的点所在区间的更新次数进行求和 这样就可以在时间上,大大缩短,查询和统计的时间复杂度都为log(n) 树状数组中的每个节点都代表了一段线段区间,每次更新的时候,根据树状数组的特性可以把b以前包含的所有区间都找出来,然后把b以前的区间全部加一次染色次数。然后,再把a以前的区间全部减一次染色次数,这样就修改原创 2016-10-18 21:46:20 · 414 阅读 · 0 评论