TZOJ 5694 区间和II(树状数组区间加区间和)
描述
给定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(树状数组区间加区间和)的更多相关文章
- hdu1556 树状数组区间更新单点查询板子
就是裸的区间更新: 相对于直观的线段树的区间更新,树状数组的区间更新原理不太相同:由于数组中的一个结点控制的是一块区间,当遇到更新[l,r]时,先将所有能控制到 l 的结点给更新了,这样一来就是一下子 ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 树状数组区间加法&区间求和操作
树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...
- hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场
题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...
- hdu 1116 敌兵布阵(树状数组区间求和)
题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
随机推荐
- Mysql8.0导入数据时出错
在Windows操作系统下,使用命令行将已经创建好的txt文件导入到mysql的pet表中. 出现ERROR 1148 (42000): The used command is not allowed ...
- case class 和class的区别以及构造器参数辨析
工作中偶然发现Scala构造方法中的参数,无论是否有val/var修饰都可以顺利编译运行,如下: class AA(name: String) class BB(val name: String) 那 ...
- Preloading Your ASP.NET Applications
You may have noticed that the first request to an ASP.NET Web site takes longer than subsequent requ ...
- linux 安装中文支持
下载 fonts-chinese-3.02-12.el5.noarch.rpm fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm 安装各种提示的依赖 安装 chkf ...
- JNI内存泄露JNI ERROR (app bug): local reference table overflow (max=512)
原因是没即时释放对象,原本的代码是这样 static jobject getMaps(JNIEnv *env,jclass obj) { jclass stringbuilder_class = (* ...
- udp重发
最近在处理框架通讯方面的问题,通过积累的开发经验,其实在很多情况(尤其是实时大数据量),udp是占有很多优势的:不需要连接,只管发送,理论上要快很多; 另外在穿墙上占有很大优势: 但是最大的一个问题就 ...
- linux命令及用法
- ExcelPackage 读取、导出excel
private static string GetString(object obj) { try { return obj.ToString(); } catch (Exception ex) { ...
- JS sort() 方法
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. array.s ...
- Python环境下的Sublime Text3无法使用input()函数
在Sublime Text3中写好Python程序,按Ctrl+B运行程序,在控制台中输入内容,回车,程序没有响应.最后求助网络,找到了解决办法. 一.安装插件SublimeREPL 按Ctrl+Sh ...