1082 线段树练习 3

题意: 给定序列初值, 要求支持区间修改, 区间查询

Solution

用树状数组, 代码量小, 空间占用小

巧用增量数组, 修改时在 \(l\) 处 $ + val$ , \(r + 1\) 处 $ - val$, 在 \(x\) 处的值就是 \(\sum_{i = 1}^{x}c[i]\)

这就是区间更新, 单点求值的树状数组

那么怎么区间更新区间查询呢?

设增量数组为 \(b[i]\)

显然, 查询 \(1 - x\) 的答案为: \(\sum_{i = 1}^{x}\sum_{j = 1}^{i}b[i]\)

这样还不明朗, 无法得到一个比较通项的前缀和, 所以进行如下变换:

\[\sum_{i = 1}^{x}\sum_{j = 1}^{i}b[i]$$$$=\sum_{i = 1}^{x}(x - i + 1) * b[i]$$$$=(x + 1)\sum_{i = 1}^{x}b[i] - \sum_{i = 1}^{x}i * b[i]
\]

这样一来, 我们通过两个树状数组分别维护 \(\sum_{i = 1}^{x}b[i]\) 和 \(\sum_{i = 1}^{x}i * b[i]\), 即可快速计算得答案

具体的, 第一个树状数组 我们在 \(l\) 处 $ + val$ , \(r + 1\) 处 \(- val\), 第二个树状数组在 \(l\) 处 $ + l * val$, \(r + 1\) 处 \(- (r + 1) * val\)

\(1-x\)前缀和即为 \((x + 1) * get\_sum(x, 0) - get\_sum(x, 1)\)

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 400019;
LL num, na;
#define lowbit(i) ((i) & (-i))
LL v[maxn], sum[maxn];
LL c[maxn][2];
void update(LL x, LL val, LL o){
for(LL i = x;i <= num;i += lowbit(i))c[i][o] += val;
}
LL get_sum(LL x, LL o){
LL ans = 0;
for(LL i = x;i > 0;i -= lowbit(i))ans += c[i][o];
return ans;
}
int main(){
num = RD();
for(LL i = 1;i <= num;i++)v[i] = RD(), sum[i] = sum[i - 1] + v[i];
na = RD();
for(LL i = 1;i <= na;i++){
LL cmd = RD(), l = RD(), r = RD();
if(cmd == 1){
LL val = RD();
update(l, val, 0), update(r + 1, -val, 0);
update(l, l * val, 1), update(r + 1, (r + 1) * -val, 1);
}
else{
printf("%lld\n",sum[r] - sum[l - 1] + (r + 1) * get_sum(r, 0) - get_sum(r, 1) - l * get_sum(l - 1, 0) + get_sum(l - 1, 1));
}
}
}

1082 线段树练习 3 && 树状数组区间修改区间查询的更多相关文章

  1. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

  2. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  3. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  4. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  5. bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 RELEASE操作可以对应LCT的 access,RECENTER则是 makeroo ...

  6. [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询

    #include <cstdio> #include <algorithm> #include <cstring> #include <cctype> ...

  7. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  8. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  9. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

随机推荐

  1. 读书笔记 之 java编程思想3

    现在已经读到第二章  ,这个发现好多已经能都知道了  但是还是有自己比较生疏的比如说就是 储存到什么地方:书中介绍五种储存的地方 分别为1储存器,2堆栈,3堆4常量储存 5非RAM储存,java的出来 ...

  2. html border画三角形

    最近遇到了问题就是画推进条类似于

  3. NetFPGA-SUME下reference_nic测试

    Reference_nic Reference_nic是NetFPGA-SUME中提供的一个参考Demo,本文主要介绍如何构建并在SUME上运行reference_nic. GIT源 git clon ...

  4. CANOpen学习指南

    对于初学者,相对于其他总线的资料来说,在国内CANOpen的资料并不多.而且并不是所有资料都适合初学者看的.这里给出一些建议,对CANOpen感兴趣的,可以参考一下学习的顺序. 前提:需要对CAN总线 ...

  5. BeTa阶段Day4

    一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:优化障碍物生成. 林庭亦:调整难度设置. 郑子熙:改进UI,美化界面. 陈文俊:优化代码结构. 2.讨论项目每 ...

  6. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day6)

    提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 数据库整理. 吴慧婷:我的世界界面完成部分. 陈敏: 我的世界功能--学习情况功能完成. 吴雅娟:我的世界功能--学习 ...

  7. 学习mysql触发器遇到的问题

    在 mysql.exe 下面运行的.如果是的话, 可能是需要加一个 定义 DELIMITER // 意思是告诉 mysql , 遇到 // 符号以后, 才认为语句结束了. 否则 mysql 遇到 分号 ...

  8. HBase 架构与工作原理5 - Region 的部分特性

    本文系转载,如有侵权,请联系我:likui0913@gmail.com Region Region 是表格可用性和分布的基本元素,由列族(Column Family)构成的 Store 组成.对象的层 ...

  9. 虚拟机centos 安装 redis 环境 linux 使用 java 远程连接 redis

    redis官网地址:http://www.redis.io/ 最新版本:2.8.3 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1.下载源码,解压缩后编译源码. $ wget ...

  10. 【bzoj5084】hashit 广义后缀自动机+树链的并+STL-set

    题目描述 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 输入 一行一个字符串Q,表示对S的操作 如果第i个字母是小 ...