upc 最⼤⼦段和 线段树 + 懒标
发布日期:2021-09-25 23:57:48
浏览次数:6
分类:技术文章
本文共 2779 字,大约阅读时间需要 9 分钟。
最⼤⼦段和
时间限制: 1 Sec 内存限制: 128 MB 题目描述 现在给你⼀个序列a1…an,求⼀个权值和最⼤的区间(区间可以为空),其中相同的数只算⼀次。 输入 第⼀⾏⼀个正整数n, 接下来⼀⾏n个整数,a1到an。 输出 ⼀⾏⼀个整数表⽰答案。 样例输入 Copy 【样例1】 5 1 -3 2 2 -4 【样例2】 5 4 -2 0 -2 3 样例输出 Copy 【样例1】 2 【样例2】 5 提示 对于100%的数据,n≤200000,|ai|≤108师傅巨巨给的思路,orz。
考虑用线段树维护一段连续区间,假设这个连续区间用 b [ j ] 表示,b [ j ] 表示 a [ j ] ~ a [ i ] 的连续区间,i 是当前枚举到的数,从 1 ~ n 枚举,也就是说线段树维护的是一段区间,并不是位置。枚举的时候分以下两种情况
(1)当前 a [ i ] 在之前没有出现过的时候,那么直接将 1 ~ i 用线段树存的区间结尾都加上 a [ i ] ,并更新 a [ i ] 出现的位置。 (2)当前 a [ i ] 在之前 pos 这个位置出现过,那么 pos + 1 ~ i 加上 a [ i ],并更新位置,也就是 b [ pos + 1 ] ~ b [ i ] 的区间都加 a [ i ] 。让后线段树每个结点需要存 sum ,lazy ,msum ,mlazy,sum是存的当前区间的和,msum存的是当前区间最大子段和,lazy是懒标,mlazy是懒标的最大子段和。
除了pushdown操作其他的都很简单,跟普通的线段树一样,讲一下pushdown。
(1)更新 msum 的时候,儿子的 sum + 父亲的 mlazy ,不用子区间 msum 来更新是因为儿子 msum 不一定能和父亲的 mlazy 接起来。 (2)更新 mlazy 的时候,儿子的 lazy + 父亲的 mlazy ,这个理解方式跟(1)一样,因为lazy也算是一个连续区间,而儿子的 mlazy 不一定能跟父亲的 mlazy 接起来。 (3)对于儿子的 sum 和 lazy ,直接把懒标接在后面即可。其他的实现具体可以看代码。
#include#include #include #include #include
转载地址:https://blog.csdn.net/DaNIelLAk/article/details/106081948 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年03月23日 23时06分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
模块化开发规范
2019-04-26
webpack入门介绍(一)
2019-04-26
webpack入门介绍(二) --- loaders
2019-04-26
webpack入门介绍(三) ---plugins
2019-04-26
关于 Git 的基础知识可能你还不知道
2019-04-26
mysql-基础
2019-04-26
python3-basic
2019-04-26
测试方法(1)
2019-04-26
python3-django
2019-04-26
功能测试(1)
2019-04-26
安全性测试(1)
2019-04-26
html基础
2019-04-26
vi—终端中的编辑器
2019-04-26
Linux
2019-04-26
jmeter-性能测试基础
2019-04-26
unittest
2019-04-26
错误推断法-维护中
2019-04-26
AJAX教程
2019-04-26
git基础
2019-04-26
git基础-01
2019-04-26