树状数组区间修改and查询和
在差分数组上稍加改变,就可以实现这个骚操作
首先我们先来看一看普通的树状数组(基于差分)怎么暴力的求解区间和就是询问区间长度次和
\(\sum^{i=1}_{len}\sum^{j=1}_{i}base[j]\)
base为原数列
以上便是暴力求解,然后我们可以发现\(base[i]\)被加了\(p-i+1\)次
于是乎,我们就可以改写上式成为下式
\((len+1)\sum^{i=1}_{len}-\sum^{i=1}_{len}(base[i]*i)\)
我们用一个树状数组维护\((len+1)\sum^{i=1}_{len}\),另一个维护\(\sum^{i=1}_{len}(base[i]*i)\)就可以了
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long base_1[101000];
long long base_2[101000];
int len;
void insert(long long val,int pos)
{
int now=pos;
while(now<=len)
{
base_1[now]+=val;
base_2[now]+=val*pos;
now+=now&(-now);
}
return ;
}
long long sum(int pos)
{
long long res1=0,res2=0,now=pos;
while(now)
{
res1+=base_1[now];
res2+=base_2[now];
now-=now&(-now);
}
return res1*(pos+1)-res2;
}
void updata(long long val,int pos)
{
int now=pos;
while(now<=len)
{
base_1[now]+=val;
base_2[now]+=val*pos;
now+=now&(-now);
}
return ;
}
long long check(int l,int r)
{
return sum(r)-sum(l-1);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
len=n;
long long pa,pb=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&pa);
updata(pa-pb,i);
pb=pa;
}
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(a==1)
{
scanf("%lld",&pa);
updata(pa,b);
updata(-pa,c+1);
}
else
{
printf("%lld\n",check(b,c));
}
}
}
树状数组区间修改and查询和的更多相关文章
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- 【树状数组区间修改单点查询】HDU 4031 Attack
http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
随机推荐
- ArrayList中进行删除操作引发的问题
1.普通for遍历 for(int i=0;i<list.size();i++){ if(list.get(i).equals("a")) list.remove(i); } ...
- myEclipse更换SVN登录账号
Win10下 找到下面路径删除其下的所有文件 C:\Users\Administrator\AppData\Roaming\Subversion\auth\svn.simple AppData默认隐藏 ...
- jsp中判断if 和 else
<c:choose> <c:when test="${date==datetime}"> ...
- Git常用配置
Git设置默认用户名和密码 1.进入C:\users\Administrator目录下,通过git bash终端输入touch .git-credentials后回车2.打开生成的.git-crede ...
- pat06-图7. How Long Does It Take (25)
06-图7. How Long Does It Take (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue ...
- jQuery Validate使用说明
jQuery Validate 导入 js 库 <script src="./jquery-validation/lib/jquery-1.8.3.js" type=&quo ...
- 斗鱼扩展--DouyuRoom使用说明(十四)
1.从 https://pan.baidu.com/s/1yBfZFtcakbDxmyas0VCpRw 下载 DouyuRoom.zip 然后解压到一个目录,我是放在C盘根目录下的,你们随意.然后解压 ...
- promise之nodejsQ的详细用法总结
这里主要讲node.js中Q的各种用法及说明总结,不详细介绍promise及原理.关于promise介绍可以查看我的另一篇文章: https://www.cnblogs.com/yzeng/p/976 ...
- 表单(form)成为 ajax 提交的表单(form)
1.form <form id="ff" method="post"> <div> <label for="name&q ...
- logback配置说明
我觉得对于logback大家不太明白的有:过滤器.logger和root以及其中的一些属性的关系.其他的应该不是多迷糊,所以我就主要说说这几个的关系,并且为了清晰我只说控制台日志,写到文件的日志配置大 ...