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 ...
随机推荐
- 云函数调用云函数 openid不存在
最近发现了一个问题 就是我使用云函数调用云函数的时候,将openid存入数据库发现为空,怎么回事呢,一查, 原来是这样 还是没有仔细看文档的错啊
- oracle 索引操作
1 查询表中所有的索引 -- 固定写法"tb_user"(注意大小写)为表名 select * from user_indexes where table_name='tb_use ...
- 个人网盘搭建SeaFile
资料参考: https://www.ittel.cn/archives/2904.html https://www.cnblogs.com/jiuyachun/p/10185111.html 恢复和 ...
- urllib编码问题踩坑
今天在使用python的urllib对网页进行爬取的时候,中文一直出现错误 UnicodeEncodeError: 'ascii' codec can't encode character '\u62 ...
- eval对函数this指向的影响
js eval() 对 this 指向的影响 const fn = () => { console.log('fn this is:', this) } function evalWrapper ...
- char 与 string 互转 byte与string互转 list<string>与string[]互转 char与byte互转
class Program { static void Main(string[] args) { ...
- CRC校验模板
#ifndef CRC_H #define CRC_H #include "main.h" #ifdef CRC_C #endif typedef struct { uchar R ...
- thirty
数组中的方法 filter filter方法可以过滤符合条件的数值,返回一个新数组,可以利用filter和indexOf进行数组去重操作(indexOf返回的是该数组内的值第一次出现的索引,若无该值返 ...
- COOP/COHP(上)-PROOUT
晶体轨道重叠布居 COOP(crystal orbital overlap population)的一个更为直观的名称是 重叠布居权重的态密度 (overlap population-weighted ...
- HFS~HTTP File Server 2.4rc2 20191231
后台,打卡,这有的 电脑 PC 浏览器 打开 安卓平台,浏览器,打开,界面