[P3374 【模板】树状数组 1](单点修改,区间查询)
*P3374 【模板】树状数组 1*
第一道线段树的题,很好的板子题,中文体面就不过多解释了。
直接上代码(注释很详细了,前提学过线段树)
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 7;int n, a[N], opnum;
int op, pos, L, R, k;struct segment_tree {struct tree {int l, r;int lazy;int sum;}tr[N * 4];void build(int i, int l, int r) { //创建一棵树,i是节点,l时左边界,r是右边界tr[i].l = l, tr[i].r = r; // 该结点的区间[l , r];if (l == r) { //当前为叶节点tr[i].sum = a[l]; //叶节点存储的是单个数字且是a数组中的数字return;}int mid = (l + r) >> 1;build(i * 2, l, mid); // 递归构造左子树build(i * 2 + 1, mid + 1, r); //递归构造右子树tr[i].sum = tr[i * 2].sum + tr[i * 2 + 1].sum; //更新结点sum的值,是从下往上确定每个节点的sum的}inline void add(int i, int dis, int k) {//单点修改,i是节点,dis是修改的位置,k是增加或减少的值if (tr[i].l == tr[i].r) { //判断到叶节点的时候说明找到了该数,该数字 + k;tr[i].sum += k;return;}if (dis <= tr[i * 2].r) add(i * 2, dis, k); //dis在哪里就往哪边靠else add(i * 2 + 1, dis, k); tr[i].sum = tr[i * 2].sum + tr[i * 2 + 1].sum; //从下往上重新确定路径上的节点的sum值return;}inline int serch(int i, int l, int r) { //区间查询,i是节点,要求[l, r]内值的和if (tr[i].l >= l && tr[i].r <= r) { //当节点的整个区间都被包含时就返回sumreturn tr[i].sum;}else if (tr[i].l > r || tr[i].r < l) return 0; // 当节点区间和所求的区间没有任何关系时返回0int s = 0;if (tr[i * 2 + 1].l <= r) s += serch(i * 2 + 1, l, r); // 当节点的右区间有重合时,就递归往又找,同时累加sif (tr[i * 2].r >= l) s += serch(i * 2, l, r); //当节点的左区间有重合时,同理操作return s;}
}ST;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> opnum;for (int i = 1; i <= n; i++) {cin >> a[i];}ST.build(1, 1, n); // 建树for (int i = 1; i <= opnum; i++) {cin >> op;if (op == 1) {cin >> pos >> k;ST.add(1, pos, k); // 单点修改}else {cin >> L >> R;int re = ST.serch(1, L, R); // 区间查询cout << re << '\n';}}
}
[P3374 【模板】树状数组 1](单点修改,区间查询)相关推荐
- 树状数组(单点修改,区间修改等)
前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- Billboard HDU - 2795(树状数组,单点修改,区间查询)
题目链接:https://vjudge.net/problem/HDU-2795 思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了. ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- 树状数组之区间修改单点查询
树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如: a[10]={4, 6, 7, 5, 1, 6, ...
- 树状数组的区间修改+查询
首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...
- [算法模板]树状数组
[算法模板]树状数组 思路 图片转自:yhf_2015--彻底理解树状数组 使用这个图片就能很快的理解树状数组. 我们可以先根据图片来分解一个十进制数成二次幂. example: \(15=2^0+1 ...
- 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询
如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...
- 【luogu3368】模板 树状数组 2
题面 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 题解1 单点查询+区间修改. -.-说了树状数组模板那就用树状数组. 树状数组维护差分数列即可(差分前 ...
- 树状数组(单点+区间的所有操作)
转载:https://blog.csdn.net/I_believe_CWJ/article/details/80374326 更简洁方便的数据结构--树状数组(基于线段树的实现) 1.单点更新+区间 ...
最新文章
- excel中如何筛选重复数据
- 《Windows Server 2012 Hyper-V虚拟化管理实践》——3.2 Hyper-V主机日常管理
- 虚拟机系列 | 执行引擎和垃圾回收
- spring 多线程 写入数据库 和 写入 xml文件
- centos7查看mysql日志_centos 7 mysql启动失败–学会看错误日志
- 计算机cpu图片,电脑处理器天梯图2019
- mb.php js 劫持,黑帽seo防止网站被k的js劫持跳转代码
- 如视技术副总裁杨永林:当传统产业遇到“数字空间”
- php 抓取网页图片
- 计算机组成原理sp接口,计算机组成原理2008年4月真题试题(02318)
- 炸⾦花棋牌游戏Python
- 用Ruby替代Java做rest接口的单元测试!
- 作为技术分析工具的 MTF 指标
- 项目GIF斗图软件 总结概述
- Rodrigues(罗德里格斯)公式的理解与应用(旋转矢量与旋转矩阵的转化)
- 打字狗打字练习 - java关键字
- 一步一步的使用C++和OPENGL实现COLLADA骨骼动画 第一部分
- 以太网口差分电平_【成功案例】贴装TVS SP0505在RJ45以太网接口防护电路的应用,节约印制板空间...
- mix1 android n,MIX - 指尖的数字暗房 - Android 应用 - 【最美应用】
- 激活海量数据价值,实现生产过程优化
热门文章
- 5项基因改造让你拥抱大财富
- 支付宝信用卡还款即将收费,3个方法免手续费!
- 汇率兑换程序python按温度转换_python复习+实例编写(1)——温度转换、汇率转换...
- AWS如何安全顺利关闭所有的免费服务
- Linux中如何检测IP地址冲突问题
- php 微信表情存储,轻松处理PHP开发中微信emoji表情mysql存储的问题
- 2019 最烂密码排行榜大曝光!网友:已中招
- android 自动替换资源文件,简单高效的实现Android App全局字体替换
- 【电信学】【2019.03】5G异构网络中的移动性管理
- login主页面+接口+依赖