线段树
Rem_Inory
这个作者很懒,什么都没留下…
展开
-
【题解】洛谷P3373 线段树2 && codevs P2216 行星序列(线段树)
既有加法又有乘法的线段树模型,第一感觉是开两个数组来记录标记,然后写两个pushdown函数,对不同情况进行操作,判断儿子节点有没有加法或乘法的标记啦。。。总之很复杂。经过各种情况的考虑和优化过后,我们拿到了…………70分。 那我们就需要想想更好的做法了。两个pushdown函数真的必要吗?答案是否定的。我们定义对儿子的sum计算为父亲的sum*乘法标记+加法标记*区间长度。然后如果对加法或乘法...原创 2018-07-29 19:44:14 · 181 阅读 · 0 评论 -
【题解】洛谷P3374 树状数组 P3368树状数组2 P3372 线段树1 (线段树)
分别对应三种不同情况的线段树做法。 首先说3374 这个是对某个数进行加减求区间和,相对来说是最简单的一种,不需要标记,用于对线段树有初步的理解。 #include<cstdio> #include<iostream> #include<algorithm> #define ll long long using namespace std; const i...原创 2018-07-29 19:51:43 · 244 阅读 · 0 评论 -
【题解】bzoj P1012 最大数(线段树)
可以用线段树解决这个问题,对某个叶子节点修改其值,最后寻找在某个区间内的最大值。这里只需要把儿子结点相加的操作变为父亲结点=儿子节点的最大值即可。 #include<cstdio> #include<iostream> #include<algorithm> #define ll long long using namespace std; const in...原创 2018-07-29 22:19:26 · 206 阅读 · 0 评论 -
【题解】洛谷P4513 小白逛公园(线段树)
这里要对某个叶子节点的值进行修改,最后求某一段区间内的某一段和的最大值,可以用线段树来解决,但需要多开一些数组存储更多的信息。 我们定义ln数组记录某个结点从左开始某一段区间和的最大值,定义rn数组为某个结点从右开始某一段区间和的最大值,定义midd数组记录某个结点在中间的某一段区间和的最大值,sum数组为子结点的和。这样我们对于update数组就需要添加一些东西。不难得到ln[now]=max...原创 2018-07-30 08:41:02 · 309 阅读 · 0 评论 -
【题解】vijos P1659 河蟹王国(线段树)
实质上是对线段树的区间进行值的修改,然后查询一段区间内某个元素的最大值。 注意可能有负数,所以在查询函数里ans初始化为-1e9 注意在pushdown时除了把标记放下来还要把sum放下去,sum+=mark,否则举个例子 你得到了4-6的mark 把mark给了6-6,让你查询6-7,然后你的mark给了6-6 但你的sum没有给,所以需要如此更新。最后update函数返回子节点最大值即可。...原创 2018-07-30 10:21:53 · 190 阅读 · 0 评论 -
【题解】洛谷P2161 会场预约(线段树)
先说一下这道题的解题思路,我们使用离线操作的做法。记录读入的数据,把开始结束日期存在结构体里,并记录是A操作还是B操作。开一个数组记录染色情况、一个cnt数组记录第几个操作推掉了几个预约,读入后我们倒着循环进行查找,如果读入的是B就跳过,如果是A的话就将开始到结束日期的所有点染成当前序号的颜色。如果循环到某段日期它已经有染色标记了,就将当前那段日期所对应的的染色标记的最小值的推掉的预约数+1(因为...原创 2018-07-30 22:07:23 · 257 阅读 · 0 评论