#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
int n,a[M];
struct SegmentTree{int l,r;//左右端点 int sum;//区间和 int lazy;//增量延迟标记
}tree[M*4];
//建树
void build(int p,int l,int r){//区间编号,区间左端点,区间右端点 tree[p].l=l;tree[p].r=r;//标识区间左右端点if(l==r){tree[p].sum=a[l];return;} int mid=(l+r)/2;build(p*2,l,mid);//递归左半 build(p*2+1,mid+1,r);//递归右半 //回溯时更新区间附加信息tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;//pushup
}
void print(int p)
{cout<<p<<" "<<tree[p].l<<" "<<tree[p].r<<" "<<tree[p].sum<<endl;if(tree[p].l==tree[p].r)return;print(p*2);print(p*2+1);
}
void update(int p,int x,int v){if(tree[p].l==tree[p].r){tree[p].sum=v;return;}int mid=(tree[p].l+tree[p].r)/2;if(x<=mid) update(p*2,x,v);else update(p*2+1,x,v); tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}//单点修改
/*int query(int p,int l,int r){if(l<=tree[p].l&&tree[p].r<=r) return tree[p].sum;int mid=(tree[p].l+tree[p].r)/2;int val=0; if(l<mid) val+=query(p*2,l,r);//累加左半重叠部分 if(r>mid) val+=query(p*2+1,l,r);//累加右半重叠部分 return val;
}*///写法1
int query(int p,int l,int r){if(l<=tree[p].l&&tree[p].r<=r) return tree[p].sum;//pushdown(p);区间增加添加 int mid=(tree[p].l+tree[p].r)/2;if(r<=mid) return query(p*2,l,r);if(l>mid) return query(p*2+1,l,r);else return query(p*2,l,r)+query(p*2+1,l,r);
} //写法2
/*void add(int p,int d){tree[p].sum=d*(tree[p].r-tree[p].l+1);if(tree[p].l==tree[p].r)return;  add(p*2,d);add(p*2+1,d);
}*///树的重构
void pushdown(int p){if(tree[p].lazy){//有延迟标记//更新左右子节点信息 tree[p*2].sum+=tree[p].lazy*(tree[p*2].r-tree[p*2].l+1);tree[p*2+1].sum+=tree[p].lazy*(tree[p*2+1].r-tree[p*2+1].l+1);//为子节点增加标记tree[p*2].lazy+=tree[p].lazy;tree[p*2+1].lazy+=tree[p].lazy;//清除父节点标记tree[p].lazy=0; }
}
void update1(int p,int l,int r,int d){if(l<=tree[p].l&&tree[p].r<=r){tree[p].sum+=d*(tree[p].r-tree[p].l+1);tree[p].lazy+=d;//区间节点打上标记 return;}pushdown(p);//下传延迟标记 int mid=(tree[p].l+tree[p].r)/2;if(l<=mid) update1(p*2,l,r,d);if(r>mid) update1(p*2+1,l,r,d);//更新区间信息tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;//更新区间和
}
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];build(1,1,n);//update(1,5,1);//print(1);update1(1,2,5,1);cout<<query(1,2,3)<<endl; print(1);return 0;
}

线段树(详细注释—pushdown写法)相关推荐

  1. Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)

    题目链接:D. Frets On Fire 思路:明明可以离散化+二分写,思路硬是歪到了线段树上,自闭了,真实弟弟,怪不得其他人过得那么快 只和查询的区间长度有关系,排完序如果相邻的两个点的差值小于等 ...

  2. Wikioi 1081 线段树成段更新单点查询

    线段树练习飘逸的写法,自从自己改成这样的写法之后,线段树就没再练过,如今最终练得上了. 由于这里查询仅仅是查询了叶子结点,所以pushUp函数就用不上了,只是我没去掉之前是3ms.去掉之后反而变成4m ...

  3. b+树时间复杂度_前端大神用的学习笔记:线段树和树状数组

    全文篇幅较长,细心理解一定会有收获的♪(^∇^*). 1|0线段树 1|1一些概念     线段树是一种二叉搜索树,每一个结点都是一个区间(也可以叫作线段,可以有单点的叶子结点),有一张比较形象的图如 ...

  4. Change FZU - 2277(线段树+dfs序)

    There is a rooted tree with n nodes, number from 1-n. Root's number is 1.Each node has a value ai. I ...

  5. HDU - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?! 莫队/单调栈 + 线段树/ST表在线

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑将贡献分开来算,先计算最大值,再算个最小值,之后答案就是((max+min)/2)/(len∗(len+1)/2)((max+min)/2)/(l ...

  6. c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)

    整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...

  7. Codeforces Round #370 (Div. 2)E. Memory and Casinos[期望概率+线段树区间合并]详细推导

    题目链接 题目大意:就说一个赌徒在nnn个赌场里面转,在每个赌场他有pip_ipi​的胜率,如果赢了就向右走,输了就向左走,如果到达000或者n+1n+1n+1号赌场就相当退出的了赌局.定义统治区间[ ...

  8. P3373 【模板】线段树 2

    P3373 [模板]线段树 2 相对于线段树模板1有了区间乘的操作,所以增加了一个乘的延迟标记,当加和乘的次序不同的时候,我们要好好考虑这两个延迟标记对孩子的影响.所以这里我们是采取的是先乘后加. 线 ...

  9. (转)线段树的区间更新

    原文地址:http://blog.csdn.net/zip_fan/article/details/46775633 写的很好,昨天刚刚开始写线段树,有些地方还不是很明白,看了这篇博文,学会了数组形式 ...

最新文章

  1. 不要随意重装你的操作系统
  2. QG3系统无法创建SAP employee的原因
  3. OSChina 周六乱弹 —— 这个版本的小红帽听说过吗?
  4. 易语言程序应用程序错误退出_为什么我退出Google并构建了一个向孩子们教授个人理财的应用程序
  5. PWM信号作用示例——调节台灯亮度
  6. 联邦学习隐私保护研究进展
  7. 并发编程实战——锁分段
  8. java和oc_Java和OC中的数据容器和数组
  9. mysql 左表为null_sql left join count 左表为空表的时候出现空行
  10. 网络七层协议(转载)
  11. 详解C/C++预处理器
  12. 【原创】基于Qt5.14的一站式安卓开发环境搭建
  13. php滚动播报,卫星云图滚动播放(实时更新)
  14. Windows图标-Icon文件格式分析。
  15. XSS Challenges stage#12-16 闯关详解
  16. 爬取国内高匿代理,并验证每个代理是否可用
  17. VOS中客户在设置服务器防火墙时需要打开哪些 VOS 应用端口
  18. Data Struct - Book
  19. 数据可视轻松制作多点飞线图
  20. “屠龙之技”与“潜规则”(Mediator模式)

热门文章

  1. eChars实现哈尔滨市区县地图展示
  2. 前端表单提交方式大全
  3. 安全狗等级保护建设服务内容有哪些?
  4. 高级shell编程笔记(第十三章 系统与管理命令)
  5. 为什么加密货币投资者正在放弃他们的美国公民身份
  6. exe文件在服务器上打不开,EXE格式文件打不开怎么办?三个方法教你打开
  7. 微信小程序之发送通知消息(通过openid推送消息给用户)
  8. 你只需要做你一个让世界随之起舞的枭雄
  9. 【运用flex制作携程界面练习笔记】
  10. 用c语言编写打猎小游戏,使用c语言编写简单小游戏.docx