Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]
P3368 【模板】树状数组 2
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数数加上x
2.求出某一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含2或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x 含义:输出第x个数的值
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
6
10
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:
故输出结果为6、10
Solution
我们定义$c[i]$表示$a[i]-a[i-1]$就是$a[i]$和$a[i-1]$之间的距离
而且规定$c[1]=a[1]$
那么很明显
$a[i-1]+c[i]=a[i]$
我们把c放入树状数组e里面
## 注意e是树状数组!!!
查询
然后我们可以得出
$query(x)=\sum^{i<=x}_{i=1}c[i]$
$ =c[1]+c[2]+...+c[x-1]+c[x]$
$ =(a[1])+(a[2]-a[1])+...+(a[x-1]-a[x-2])+(a[x]-a[x-1])$
$ =a[1]-a[1]+a[2]+...-a[x-2]+a[x-1]-a[x-1]+a[x]$
$ =a[x]$
初始插入
刚开始将$c[i]$(也就是$now-last$)插入树状数组就可以啦
修改
因为给$a[x]+z$后
$a[x]$和$a[x-1]$的距离增加了z ,于是我们要给$a[x]-a[x-1]$(即$c[x]$)加上$z$
因为给$a[y]+z$后
$a[y]$和$a[y+1]$的距离减少了z ,于是我们要给$a[y]-a[y+1]$(即$c[y+1]$)加上$-z$
那中间$x<i<y$不用处理?
当然,因为$c[i]$存的只是$a[i]和a[i-1]$的距离啊!
Codes
1 program no;
2 var
3
4 n,m,i,now,last,c,x,y,z:Longint;
5 e:array[1..500000] of Longint;
6
7 function lowbit(apple:Longint):Longint ;
8 begin
9 lowbit:=apple and -apple;
10 end;
11
12 procedure add(x,a:Longint);
13 begin
14 while x<=n do
15 begin
16 e[x]:=e[x]+a;
17 x:=x+lowbit(x);
18 end;
19 end;
20
21 function query(x:Longint):longint;
22 begin
23 query:=0;
24 while x>0 do
25 begin
26 query:=query+e[x];
27 x:=x-lowbit(x);
28 end;
29 end;
30
31 begin
32 //assign(input,'1.in'); assign(output,'1.out');
33 reset(input); rewrite(output);
34
35 readln(n,m);
36 for i:= 1 to n do
37 begin
38 read(now);
39 add(i,now-last);
40 last:=now;
41 end;
42
43 for i:= 1 to m do
44 begin
45 read(c,x);
46 if c=1 then
47 begin
48 readln(y,z);
49 add(x,z);
50 add(y+1,-z);
51 end
52 else writeln(query(x));
53 end;
54
55 close(input); close(output);
56 end.
Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]的更多相关文章
- 洛谷 P3368 【模板】树状数组 2(区间修改点查询)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- hdu1556树状数组的区间更新单点查询
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
这题反反复复,到现在才过. 这道题就是树状数组的逆用,用于修改区间内容,查询点的值. 如果单纯就这个奇偶数来判的话,似乎这个思路比较好理解. 看了一下国家集训队论文(囧),<关于0与1在信息学奥 ...
- gym102220H 差分+树状数组(区间修改和输出)
这题目很有意思,让我学会了树状数组的差分,更加深刻理解了树状数组 树状数组的差分写法 void add(int x,int k) { for (int i = x;i <= n;i += low ...
- POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 69589 ...
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...
随机推荐
- 使用EmguCV3.0.0调用摄像头并设置帧率
此教程使用emgu3.0.0,其他版本兼容性未知. 转载请注明出处: http://www.cnblogs.com/zaiyuzhong/p/open-camera-with-emgu3_0_0.ht ...
- 小程序微信支付完整demo,包含退款
最近刚完成一个商场小程序(http://market.zhenzikj.com/detail/121.html), 使用到了微信支付功能,其中遇到了很多的抗,所以,我把支付这块摘出来,以免大家少走弯路 ...
- 下载安装sqlyog
sqlyog下载地址: https://github.com/webyog/sqlyog-community/wiki/Downloads 下载社区版,然后傻瓜式安装
- 基于Vue项目+django写一个登录的页面
基于Vue项目+django写一个登录的页面 前端 借用了一下vue项目模板的AboutView.vue 页面组件 <template> <div class="about ...
- Python-闭包(Closure)
一.认识闭包 有时候需要在函数外部得到函数内部的局部变量,但是由于Python作用域的关系,这一点是无法实现的. def f(): n = 22 print(n) #NameError:name 'n ...
- 基于MIPI的高性能成像系统
硬件组件Digilent Genesys ZU × 1 (FPGA平台) Digilent PCAM5 × 1 (MIPI摄像头) 软件组件AMD-Xilinx Vivado 设计套件 介绍从简单的嵌 ...
- Nginx的重写功能——Rewrite
Nginx的重写功能--Rewrite https://huaweicloud.csdn.net/63566cced3efff3090b5f470.html?spm=1001.2101.3001.66 ...
- 关于flex
flex 是 flex-grow.flex-shrink.flex-basis 的缩写. flex 的默认值是以上三个属性值的组合.假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 au ...
- Influxdb客户端使用
Influxdb客户端使用 1. 简介 Influxdb在网络上可以搜索到一个叫InfluxdbStudio的工具,但只能在window下使用,有时在其他系统下做简单数据查询时就比较麻烦,下面以Inf ...
- 01java大数据开发_Linux安装
大数据开发01--linux环境安装配置 1.1软件包和资料 需要安装:VMware.CentOs6.5.Xfth5.Xshell5.Xmind: 需要可加V:zhanjiquan666: 安装注意点 ...