树状数组区间修改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次操作 ...
随机推荐
- 转 使用utl_http获取某个http页面内容
#########1.ACL详细解释: 11g 对于XDB UTL_HTTP or others package 的权限管控进一步加强,如果需要使用到XDB 以下包 UTL_TCP, UTL_SMT ...
- app常见测试点
安装与卸载: ●应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配) ●软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里. ●安 ...
- c++ for_each( )学习
for_each()事实上是個 function template,其实质如下 [effective STL item 41] template<typename InputIterator, ...
- MVC 路由检测组件 Routing Debugger
组件下载地址 haacked.com 1.在mvc项目中引入组件 2.配置route规则 public static void RegisterRoutes(RouteCollection route ...
- line-height 150%和1.5的区别
好惨啊,九点多了没事做还不能下班,坑爹的测试啊~~~ 刚才拿这个问题调戏了下部门一位资深前端开发,结果发现,他居然不会,呵呵~~~ 这里就说下吧 html: <div class="p ...
- Hadoop Intro - Configure 01
hadoop配置文件详解.安装及相关操作 一. Hadoop伪分布配置 1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/home/Java/j ...
- 使用mongoosejs链接Mongodb
以前只是了解Nodejs 这回打算好好学学.学到熟练使用的程度 var options={ user:'test_user', pass:'123456' }; mongoose.connect('m ...
- Qt 串口连接
Qt 串口连接 使用 Qt 开发上位机程序时,经常需要用到串口,在 Qt 中访问串口比较简单,因为 Qt 已经提供了 QSerialPort 和 QSerialPortInfo 这两个类用于访问串口. ...
- HDU 5335——Walk Out——————【贪心】
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- MyEclipse 比较常用的快捷键
Ctrl+D: 删除当前行 Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编 ...