描述

给定n个整数,有两个操作:

(1)给某个区间中的每个数增加一个值;

(2)查询某个区间的和。

输入

第一行包括两个正整数n和q(1<=n, q<=100000),分别为序列的长度和操作次数;

第二行包含n个整数,a1, a2, ... , an,-1000000000 ≤ ai ≤ 1000000000;

接下来又q行,每行为以下操作之一:

(1)更新,C i, j x: 将 x加到元素ai, ai+1, ... , aj中,其中-10000 ≤ x ≤ 10000;
(2)查询,Q i j:求元素ai, ai+1, ... , aj的和。

输出

针对每次查询操作,输出结果值。

样例输入

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4

样例输出

4
55
9
15

题意

如上

题解

b[i]=a[i]-a[i-1]

那么

a[x]=Σb[i](1<=i<=x)

区间求和

Σa[i](1<=i<=x)

=ΣΣb[j](1<=i<=x,1<=j<=i)

=Σ(x-i+1)*b[i](1<=i<=x)

=(x+1)*Σb[i](1<=i<=x)-Σi*b[i](1<=i<=x)

那么同时维护b[i]和i*b[i]即可得到区间和

代码

 #include<bits/stdc++.h>
using namespace std; #define ll long long
const int N=1e5+;
int n;
ll b1[N],b2[N];
void update(int x,ll w)
{
for(int i=x;i<=n;i+=i&(-i))
b1[i]+=w,b2[i]+=w*x;
}
ll query(int x)
{
ll ans=;
for(int i=x;i>;i-=i&(-i))
ans+=b1[i]*(x+)-b2[i];
return ans;
}
int main()
{
int q,a,b;
ll x,c;
char s[];
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
scanf("%lld",&x);
update(i,x),update(i+,-x);
}
while(q--)
{
scanf("%s%d%d",s,&a,&b);
if(s[]=='C')
{
scanf("%lld",&c);
update(a,c),update(b+,-c);
}
else printf("%lld\n",query(b)-query(a-));
}
return ;
}

TZOJ 5694 区间和II(树状数组区间加区间和)的更多相关文章

  1. hdu1556 树状数组区间更新单点查询板子

    就是裸的区间更新: 相对于直观的线段树的区间更新,树状数组的区间更新原理不太相同:由于数组中的一个结点控制的是一块区间,当遇到更新[l,r]时,先将所有能控制到 l 的结点给更新了,这样一来就是一下子 ...

  2. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. 树状数组区间加法&区间求和操作

    树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...

  4. hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

    题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...

  5. hdu 1116 敌兵布阵(树状数组区间求和)

    题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. ...

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

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

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

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

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

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

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

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

随机推荐

  1. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  2. React开发环境搭建(react,babel,webpack webpack-dev-server)

    最终效果: 配置webpack 自动编译脚本, 内容更改后浏览器页面自动刷新,提高效率. 主要靠webpack 的watch 功能. npm 全局安装的包: webpack webpack-cli w ...

  3. 适用于nodercms的打包构建脚本

    背景 最近自己用nodercms搭建了一个简单的博客系统,用户发布一些自己谁便谢谢的文章.感谢nodercms团队,这个cms轻量易用,用于做个人博客太方便了.开发了博客系统,肯定设计到部署到AWS或 ...

  4. ORA-27302: 错误发生在: sskgpwrm1

    opidrv aborting process M002 ospid (3561) as a result of ORA-600ORA-27300: 操作系统相关操作: semctl 失败, 状态为: ...

  5. MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied.

    MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied. ...

  6. Postman runner参数化

    按照下面图片的顺序操作吧~ lets go 1.把要做参数化的字段的value用花括号标识起来,如:{{phone}} 2.准备一个csv的文件,把每次请求接口的参数按下图填写好,第一行写字段名称(p ...

  7. sublimit 编辑器 设置默认的编码

    1.首选项>>设置 - 用户 2.加上:"default_encoding": "UTF-8"

  8. django之forms组件

    在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...

  9. 如何解决fiddler的响应显示乱码问题

    fiddler中Response出现乱码, 这是因为HTML被压缩了, 我们可以通过两种方法去解压.方法1:点击Response Raw上方的"Response is encoded any ...

  10. Python实现多线程调用GDAL执行正射校正

    python实现多线程参考http://www.runoob.com/python/python-multithreading.html #!/usr/bin/env python # coding: ...