线段树进阶之模板观见
——————————————————————已识乾坤大,犹怜草木青。
先介绍一篇优秀的洛谷博文:https://www.luogu.org/problemnew/solution/P3372
-----------------------------------------------------------------------------------------------------------------------------------------------
lazy tag:
皎月半酒花说:
首先,懒标记(lazy tag)的作用是记录每次、每个节点要更新的值,也就是delta,但线段树的优点不在于全记录,而在于传递式记录:
整个区间都被操作,记录在公共祖先节点上;只修改了一部分,那么就记录在这部分的公共祖先上;如果四环以内只修改了自己的话,那就只改变自己。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目见此:https://www.luogu.org/problem/P3372
#include<iostream> #include<cstdio> #define MAXN 1000001 #define ll long long using namespace std; unsigned ll n,m,a[MAXN],ans[MAXN<<2],tag[MAXN<<2]; inline ll ls(ll x) {return x<<1; } inline ll rs(ll x) {return x<<1|1; } void scan() {cin>>n>>m;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]); } inline void push_up(ll p) {ans[p]=ans[ls(p)]+ans[rs(p)]; } void build(ll p,ll l,ll r) {tag[p]=0;if(l==r){ans[p]=a[l];return ;}ll mid=(l+r)>>1;build(ls(p),l,mid);build(rs(p),mid+1,r);push_up(p); } inline void f(ll p,ll l,ll r,ll k) {tag[p]=tag[p]+k;ans[p]=ans[p]+k*(r-l+1); } inline void push_down(ll p,ll l,ll r) {ll mid=(l+r)>>1;f(ls(p),l,mid,tag[p]);f(rs(p),mid+1,r,tag[p]);tag[p]=0; } inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k) {if(nl<=l&&r<=nr){ans[p]+=k*(r-l+1);tag[p]+=k;return ;}push_down(p,l,r);ll mid=(l+r)>>1;if(nl<=mid)update(nl,nr,l,mid,ls(p),k);if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);push_up(p); } ll query(ll q_x,ll q_y,ll l,ll r,ll p) {ll res=0;if(q_x<=l&&r<=q_y)return ans[p];ll mid=(l+r)>>1;push_down(p,l,r);if(q_x<=mid)res+=query(q_x,q_y,l,mid,ls(p));if(q_y>mid) res+=query(q_x,q_y,mid+1,r,rs(p));return res; } int main() {ll a1,b,c,d,e,f;scan();build(1,1,n);while(m--){scanf("%lld",&a1);switch(a1){case 1:{scanf("%lld%lld%lld",&b,&c,&d);update(b,c,1,n,1,d);break;}case 2:{scanf("%lld%lld",&e,&f);printf("%lld\n",query(e,f,1,n,1));break;}}}return 0; }
相关函数的熟悉可以以此当做模板样子丫!
建树,区间修改,区间查询这样的函数当每日三省,无比熟稔之!
转载于:https://www.cnblogs.com/dragondragon/p/11254716.html
线段树进阶之模板观见相关推荐
- 【总结】线段树 进阶
我竟然开了这么多坑...ε=(´ο`*)))唉,慢慢填吧... 线段树 进阶 前置芝士 然后我们来讲一个好玩的东西,叫权值线段树. 权值线段树&动态开点 有一个数列,数列里的每个不同的 aia ...
- 51nod3077 线段树进阶1
3077 线段树进阶1 给出一个长度为n的整数序列a1,a2,-,an,进行m次操作,操作分为两类. 操作1 :给出l,r,v,将al,al+1,-,ar分别加上v. 操作2 :给出l,r,询问 ...
- 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
[线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...
- 线段树 区间更新模板
一个带区间修改的线段树求和模板: int MAXN = 100005; ll a[100005<<2],ans,p; struct Tree {ll l,r;ll sum,add,mul; ...
- 数据结构之线段树进阶(区间更新lazy标记)
之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...
- 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)
我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...
- 线段树(SegmentTree)基础模板
线段树模板题来源:https://www.lintcode.com/problem/segment-tree-build/description 201. 线段树的构造 /*** Definition ...
- 浅谈数据结构之主席树(线段树进阶版)
今天看了点主席树的概念,加上飞哥上次讲的,目前对主席树有了大致的了解,简单谈谈吧,不讲代码,只讲思路,日后贴题! Orz高级数据结构发明者主席!!最早在CLJ的课件里第一次看到了这个词,最近做区间第K ...
- 线段树进阶(懒惰标记)
对于朴素线段树,要进行区间更新,如果按照单点更新的方法更新,他的复杂度很高,比数组暴力更新还要慢. 所以我们使用懒惰标记,他走到包含区间就不往下走了,然后就更新区间值,并打上懒惰标记.那走到这不走了, ...
最新文章
- C库函数-fgets()
- topcoder srm 410 div1
- 十大经典排序算法5(Python版本)
- 【顶】辞职也需要辞得帅,辞得大家都开心,多为将来考虑,辞职不要急,本是好事要办好...
- Boost.Interprocess
- c++输出小数点后几位_Python格式化输出:%s和format()用法比较
- 图像风格迁移 CycleGAN原理
- Apeaksoft iOS Toolkit for Mac(iOS设备数据恢复软件)
- 360怎样修改wifi服务器,360路由器怎么设置无线网络
- 【MySQL】听柠檬班公开课后,学习笔记及作业(一)
- 最小二乘法线性拟合及其代码实现(C语言)
- spring boot新闻管理系统 毕业设计源码211113
- redis基础数据结构(一)可变长字符串sds
- 中国房屋租赁行业市场发展趋势与竞争创新战略建议报告2022-2028年
- 面试被问项目经验不用慌,按这个步骤回答绝对惊艳
- php敏感字符串过滤_PHP实现的敏感词过滤方法
- 软件测试 - 缺陷管理篇
- 记事本保存音标出现乱码问题
- 几种百度云盘下载速度慢解决方法,彻底让你直接拉满宽带
- activiti工作流架构介绍及集成实现