(资料图)
线段树--解决区间问题的数据结构,相比于树状数组,更具有普适性;
完全二叉树的性质:根节下标为1,,节点为 i 的节点,左子节点为2*i,右子节点为2*i+1;
代表nums中单个元素的节点tree[x]应当在树的最底层,即叶子节点;更大的区间从叶子节点开始向上构成;
代表区间【L,R】的节点 tree【i】,左子节点tree【2*i】表示区间【L,(L+R)/2】的区间和;右子节点tree【2*i+1】表示区间 【(L+R)/2 +1, R】的区间和;
初始化tree数组的大小 总是 令 其 为 4*n;类似于归并排序、快排的分治算法,将原问题不断的划分为左右子问题;
代码摘自:线段树从入门到急停 - 力扣(LeetCode)非常详细;
核心:一个就是注意单点修改时,递归结束条件的判断,是查询单点的话,就是 左右边界相等终止;查询区间和的话, 判断当前区间是否落在 所求范围内,是的话就加上这个区间;
另一个就是拓展:区间和数组可以替换为区间最值问题;求区间最大值、区间最小值等;
再一个就是区间修改问题,有两种,一种是增量式修改,因为注意到我们的区间和,若不关注每个具体的值,只是区间和的大小,我们无需每次都向下更新到叶子节点,否则会达到O(N)时间复杂度;因此 需要增加一个 数组,判断当前增量是否已经向下更新,我们称之为懒惰标记;; 第二种就是 覆盖式修改:将区间的值都修改为同一值,此时,我们不能依据增量式修改的方法,因为可能修改为0,而向下更新的标记 也是检查是否为0,从而 会产生冲突,所以另起一个数组,判断是否已经向下覆盖;;
代码实现:(此处将 两种修改方法写在一起了,建议分开写)
#includeusing namespace std;class Segement_tree{private: vector nums; vector tree; vector lazy; vector is_updated; int n; void pushUp(int i){ tree[i] = tree[2*i] + tree[2*i + 1]; } void build(int left, int right, int i){ if(left == right){ tree[i] = nums[left]; } int mid = (left + right) / 2; build(left, mid, 2*i); build(mid + 1, right, 2*i + 1); pushUp(i); } /*单点修改*/ void add(int index, int x, int left, int right, int i){ if(left == right){ tree[i] += x; return; } int mid = (left + right)/2; if(index <= mid){ add(index,x,left,mid,2*i); }else{ add(index,x,mid+1,right,2*i+1); } pushUp(i); } void update(int index,int x,int left, int right,int i){ if(left == right){ tree[i] = x; return; } int mid = (left + right) /2; if(index <= mid){ update(index,x,left,mid,2*i); }else{ update(index,x,mid+1,right,2*i+1); } pushUp(i); } int query(int index,int left,int right, int i){ if(left == right) return tree[i]; int mid = (left + right) /2; if(index <= mid){ return query(index,left,mid,2*i); }else{ return query(index,mid+1,right,2*i+1); } } /*区间求和*/ int sum(int left, int right, int s, int t, int i){ if(left <= s && t <= right) return tree[i]; int mid = (s + t) /2; int res = 0; if(left <= mid){ res += sum(left,right, s, mid, 2*i); } if(right > mid){ res += sum(left,right, mid+1, t, 2*i+1); } return res; } /*区间修改: 增量式 */ void add(int left, int right, int x,int s, int t, int i){ if(left <= s && t <= right){ tree[i] += (t-s+1)*x; if(s != t) lazy[i] += x; return; } int mid = (s + t)/2; if(lazy[i] != 0) pushDown(s,mid,t,i); if(left <= mid) add(left,right,x,s,mid,2*i); if(right > mid) add(left,right,x,mid+1,t,2*i+1); pushUp(i); } void pushDown(int s,int mid, int t,int i){ tree[2*i] += (mid-s+1)*lazy[i]; lazy[2*i] += lazy[i]; tree[2*i+1] += (t-mid)*lazy[i]; lazy[2*i+1] += lazy[i]; lazy[i] = 0; } /*区间修改: 覆盖式 */ void update(int left, int right,int x,int s,int t,int i){ if(left <= s && t <= right){ tree[i] = (t-s+1)*x; if(s != t){ lazy[i] = x; is_updated[i] = true;//未推送 } return; } int mid = (s+t)/2; if(is_updated[i]) pushDown1(s,mid,t,i); if(left <= mid) update(left,right,x,s,mid,2*i); if(right > mid) update(left,right,x,mid+1,t,2*i+1); pushUp(i); } void pushDown1(int s,int mid,int t,int i){ tree[2*i] = (mid - s + 1)* lazy[i]; lazy[2*i] = lazy[i]; is_updated[2*i] = true; tree[2*i+1] = (t - mid) * lazy[i]; lazy[2*i+1] = lazy[i]; is_updated[2*i+1] = true; is_updated[i] = false; lazy[i] = 0; }public: Segement_tree(vector & nums){ this->n = nums.size(); this->nums = nums; this->tree.resize(4*n, 0); this->lazy.resize(4*n, 0); this->is_updated.resize(4*n, 0); build(0, n-1, 1); } /*单点修改*/ void add(int index, int x){ add(index,x,0,n-1,1); } void update(int index,int x){ update(index,x,0,n-1,1); } int query(int index){ return query(index, 0, n-1,1); } /*区间求和*/ int sum(int left,int right){ return sum(left,right,0, n-1,1); } /*区间修改 : 增量式*/ void add(int left,int right,int x){ add(left,right,x,0,n-1,1); } /*区间修改: 覆盖式 */ void update(int left,int right, int x){ update(left,right,x,0,n-1,1); }};int main(){ system("pause"); return 0;}
关键词:
(责任编辑:黄俊飞)推荐内容
- 世界热议:线段树
- 小孩子物理退烧方法_物理退烧方法
- 长颈鹿的英文儿歌_长颈鹿的英文
- 多大仇?男子砸开墓冢盗走亲戚骨灰盒扔河
- 全球最新:【运河风物】河北献县有座“不
- 去青海自驾游要注意什么 去青海自驾游要
- 最长寿野生狮王遗憾离世,已有19岁,被牧
- 辽宁最新大专院校排名 辽宁省大专学校排
- 能否结束2连败?曼联发布战狼队海报:万-
- 世界资讯:今年出梅哪一天?_今年出梅是哪
- 记者调查:一些“互助群”变味成“约死群
- 滚动:一季度河北快递业务量同比增长12.6
- 天天亮点!李嘉欣带儿子坐直升飞机过母亲
- 世界快资讯丨温度与专心 国海证券专「+
- 中国宝安与合作方签署补充协议 继续推进
- 怎么切换笔记本电脑键盘的数字键功能_怎
- 建水,一座完美诠释慢生活的小城
- 大晟文化:控股股东协议转让5.36%股份-焦
- 全国家庭教育宣传周,临沂市妇女儿童活动
- 北京周六福5月12日消息:黄金588元/克
- 吞食单机版_tun-环球热议
- 天文学家观测到有史以来最大规模宇宙爆炸
- 硬核实力!一起看“上天入地”的“大国重
- 2023东莞义务教育招生政策有什么变化?_
- 环球速递!uu加速器设置加速后智能优化内
- 今日热搜:腾讯心悦俱乐部卖账号钱不到账
- 【平安邵武】邵武市举办2023年水上交通应
- 全球新资讯:连云港海州开展遗体捐献缅怀
- 粤港经贸往来加速升温 一季度香港在粤新
- 焦点滚动:母亲节礼物?安排!就这样宠爱她
- 天天快资讯:软银集团:正为再度实施主动
- 一山有四季十里不同天描述的是哪个地方_
- 南京化纤: 公司会在定期报告中披露相应
- 即时焦点:今日起,红旗大桥恢复通行!
- 房地产开发板块涨0.82% 深深房A涨7.42%
- 中国国家航空遥感系统获取全球首套山地冰
- 黄冈医保报销的流程怎么走的 黄冈用医保
- 小孩玩滑板掉入黄浦江父母施救未果三人身
- 猫粮狗粮批发市场(猫粮狗粮批发)
- 高铁掌掴事件“东北大哥”更名并解散粉丝
- 【全球聚看点】科大讯飞(002230.SZ):在
- 主语谓语宾语是什么意思(主语谓语宾语是
- 股价异动引交易所关注 冰川网络被追问去
- 张子萱终于不给陈赫打码了 他俩为什么不
- 工商银行喜结良缘金条50克价格今天多少一
- 陇神戎发最新股东户数下降6.07% 筹码趋
- 感冒与过敏区分的方法
- 广东:县域内闭环管理肿瘤患者
- 资讯推荐:国家移民管理局:5月15日起全面
- 境内外唱将角逐新民歌挑战赛 传统民歌唱
- 先生是谁的作品_先生是谁_每日消息
- 中共广东省委办公厅 广东省人民政府办公
- 【天天新视野】米兰此前3次欧冠淘汰赛首
- 辣条的制作过程恶心 环球微动态
- 火车站一女子坠楼 事件最新后续来了!
- 百旺金穗云怎么读入发票_百旺金穗云开票
- 天天新资讯:沪农商行:2023年制造业贷款
- 老特受委屈了-当前关注
- 最新消息:上海检察三分院守护国门安全严
- 称多县气象台发布道路结冰黄色预警信号【
- 吞食单机版_tun-环球热议
- 天文学家观测到有史以来最大规模宇宙爆炸
- 硬核实力!一起看“上天入地”的“大国重
- 2023东莞义务教育招生政策有什么变化?_
- 环球速递!uu加速器设置加速后智能优化内
- 今日热搜:腾讯心悦俱乐部卖账号钱不到账
- 【平安邵武】邵武市举办2023年水上交通应
- 全球新资讯:连云港海州开展遗体捐献缅怀
- 粤港经贸往来加速升温 一季度香港在粤新
- 焦点滚动:母亲节礼物?安排!就这样宠爱她
- 天天快资讯:软银集团:正为再度实施主动
- 一山有四季十里不同天描述的是哪个地方_
- 南京化纤: 公司会在定期报告中披露相应
- 即时焦点:今日起,红旗大桥恢复通行!
- 房地产开发板块涨0.82% 深深房A涨7.42%
- 中国国家航空遥感系统获取全球首套山地冰
- 黄冈医保报销的流程怎么走的 黄冈用医保
- 小孩玩滑板掉入黄浦江父母施救未果三人身
- 猫粮狗粮批发市场(猫粮狗粮批发)
- 高铁掌掴事件“东北大哥”更名并解散粉丝
- 【全球聚看点】科大讯飞(002230.SZ):在
- 主语谓语宾语是什么意思(主语谓语宾语是
- 股价异动引交易所关注 冰川网络被追问去
- 张子萱终于不给陈赫打码了 他俩为什么不
- 工商银行喜结良缘金条50克价格今天多少一
- 陇神戎发最新股东户数下降6.07% 筹码趋
- 感冒与过敏区分的方法
- 广东:县域内闭环管理肿瘤患者
- 资讯推荐:国家移民管理局:5月15日起全面
- 境内外唱将角逐新民歌挑战赛 传统民歌唱
- 先生是谁的作品_先生是谁_每日消息
- 中共广东省委办公厅 广东省人民政府办公
- 【天天新视野】米兰此前3次欧冠淘汰赛首
- 辣条的制作过程恶心 环球微动态
- 火车站一女子坠楼 事件最新后续来了!
- 百旺金穗云怎么读入发票_百旺金穗云开票
- 天天新资讯:沪农商行:2023年制造业贷款
- 老特受委屈了-当前关注
- 最新消息:上海检察三分院守护国门安全严
- 称多县气象台发布道路结冰黄色预警信号【
- 瑞士政府:俄罗斯央行有近74亿瑞郎资产位
- 全球热头条丨理想汽车发布2023年第一季度
- 考研培训机构受影响吗(考研培训机构哪个
- 大宗交易:*ST中捷成交756万元,折价4.76
- 5月10日上海港湾(605598)龙虎榜数据:
- 今日默歌尽微凉第二版_默歌尽微凉
- 折痕可自愈,苹果公司获可折叠手机新专利
- *ST雪发(002485)5月10日主力资金净卖出
- 当前热门:砂之船今年首季每单位派息1.85
- 华为再度拿下全球5G标准必要专利第一 小
- 5月将会好运环绕,月老赐姻缘,横财滚滚
- 豪礼刷屏!繁星互娱叶微凉歌友尊享会名场
- 昆明社保卡状态查询系统 (官网+入口)
- 全球医院建设行业风向标盛会CHCC2023即将
- 外观细节进一步运动化 北京现代伊兰特N
- 【当前热闻】惠誉认为普洛斯保持了充足的
- “没有谈判余地” 美国两党争斗加剧债务
- 扫墓的花一般用多少支 扫墓鲜花用什么花
- 女子遭大学老师侵犯怀孕?校方回应:已成
- 全球今热点:尾气治理板块早盘走强 凯龙