Luogu【模板】树状数组

https://www.luogu.org/problemnew/show/P3374

单点修改, 区间查询

 1 //2018年2月18日17:58:16
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 500001;
 7 int n, m;
 8 int a[N], c[N];
 9
10 inline int lowbit(int x){
11     return x & (-x);
12 }
13 void add(int x, int k){
14     for(int i=x;i<=n;i+=lowbit(i)) c[i] += k;
15 }
16
17 int sum(int x){
18     int res = 0;
19     for(int i=x; i; i-=lowbit(i)) res += c[i];
20     return res;
21 }
22
23 int main(){
24     scanf("%d%d", &n, &m);
25     for(int i=1;i<=n;i++){
26         scanf("%d", &a[i]);
27         add(i, a[i]);
28     }
29     for(int i=1;i<=m;i++){
30         int opt, x, k;
31         scanf("%d%d%d", &opt, &x, &k);
32         if(opt == 1){
33             add(x, k);
34         }else if(opt == 2){
35             printf("%d\n", sum(k)-sum(x-1));
36         }
37     }
38
39
40     return 0;
41 }

https://www.luogu.org/problemnew/show/P3368

区间修改, 单点查询

 1 //2018年2月18日21:10:31
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 500001;
 7 int n, m;
 8 int c[N], last;
 9 int opt, x, y, k;
10
11 inline int lowbit(int x){
12     return x & (-x);
13 }
14
15 void add(int x, int k){
16     for(int i=x; i<=n; i+=lowbit(i)) c[i] += k;
17 }
18
19 int sum(int x){
20     int res = 0;
21     for(int i=x; i; i-=lowbit(i)) res += c[i];
22     return res;
23 }
24
25 int main(){
26     scanf("%d%d", &n, &m);
27     for(int i=1;i<=n;i++){
28         scanf("%d", &x);
29         add(i, x-last);
30         last = x;
31     }
32     for(int i=1;i<=m;i++){
33         scanf("%d", &opt);
34         if(opt == 1){
35             scanf("%d%d%d", &x, &y, &k);
36             add(x, k);
37             add(y+1, -k);
38         }else if(opt == 2){
39             scanf("%d", &x);
40             printf("%d\n", sum(x));
41         }
42     }
43
44     return 0;
45 }

原文地址:https://www.cnblogs.com/sineagle/p/8453222.html

时间: 2024-07-29 21:32:29

Luogu【模板】树状数组的相关文章

[模板]树状数组1/ZKW线段树

https://www.luogu.org/problemnew/show/P3374 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define rson (o<<1|1) 5 #define lson (o<<1) 6 const int N = 530000<<1;//zkw线段树只能查询(0,bit),所以只有bit-2个叶节点,bit-2<n

[模板]树状数组2

https://www.luogu.org/problemnew/show/P3368 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 #define lowbit(a) (a&(-a)) 6 7 int n, m, t[500010], bas[500010]; 8 9 inline void update(int x, int

[模板]树状数组

OJ题号:洛谷P3374 1 #include<cstdio> 2 #include<cstring> 3 #define maxn 500000 4 int n,m; 5 struct BIT { 6 int val[maxn]; 7 BIT() { 8 memset(val,0,sizeof val); 9 } 10 int lowbit(int x) { 11 return x&-x; 12 } 13 void modify(int p,const int x) {

树状数组~讲解

树状数组(Binary Indexed Tree(B.I.T)) 是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只 能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询).-------摘自百度百科 对于树状数组这种数据结构,关键词一是树状,另一个则是数组. 请看下图: 我们令每个叶节点代表每一个元素. 现在我们变形一下,顺便加上数组的编号:

树状数组 :单点修改,区间查询

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: Problem E: 树状数组 1 :单点修改,区间查询 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 231  Solved: 78[Submit][Status][Web Board] Description 给定数列 a[1],a[2],…,a[n],你需要依次进行 q个操作,操作有两类:1 i x:给定 i,x将 a[i]加上 x:2 l r:给定 l,r,求a[l]+a

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个数的值 输出格式: 输出

Luogu P3374 【模板】树状数组 1[单点修改-区间查询]

P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x k 含义:将第x个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 输出格式: 输出包

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模板 Luogu 3368

树状数组区间修改&&**--*&%&-- 好吧,我看了Running-coder的博客,久久才明白-- 废话不多说:讲思路:无------ 代码: 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int bit[1000000],n,m,d,p,xx,yy,kk; 7

树状数组1模板 Luogu 3374

树状数组? 不理解?--背代码吧--QAQ~(滑稽) 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int bit[1000000],n,m,d,p,xx,yy; 7 void add(int i,int x){ 8 while(i<=n){ 9 bit[i]+=x; 10 i+=i &am