洛谷 P3374 【模板】树状数组 1 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=3374

题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某一个数加上x

2.求出某区间每一个数的和

输入输出格式

输入格式:

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x k 含义:将第x个数加上k

操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

输出格式:

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1:

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

输出样例#1:

14
16

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

样例说明:

故输出结果14、16

AC代码:

(学习了hzwer的板子)

树状数组完全可以直接背过,一共才三四行...

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,m,tmp,x,y;
 5 int a[500005];
 6
 7 inline void read(int &x)
 8 {
 9     char ch = getchar(),c = ch;x = 0;
10     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
11     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
12     if(c == ‘-‘) x = -x;
13 }
14
15 inline int lowbit(int x)
16 {return x&(-x);}
17
18 inline void update(int x,int num)
19 {
20     while(x <= n)
21     {
22         a[x] += num;
23         x += lowbit(x);
24     }
25 }
26
27 inline int sum(int x)
28 {
29     int ans = 0;
30     while(x > 0)
31     {
32         ans += a[x];
33         x -= lowbit(x);
34     }
35     return ans;
36 }
37
38 int main()
39 {
40     read(n),read(m);
41     for(int i = 1;i <= n;++ i)
42     {
43         read(tmp);
44         update(i,tmp);
45     }
46     for(int i = 1;i <= m;++ i)
47     {
48         read(tmp),read(x),read(y);
49         if(tmp == 1)
50         {
51             update(x,y);
52         }
53         else
54         {
55             printf("%d\n",sum(y)-sum(x-1));
56         }
57     }
58     return 0;
59 }
时间: 2024-10-13 14:11:10

洛谷 P3374 【模板】树状数组 1 题解的相关文章

[模板]树状数组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

[模板]树状数组

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) {

树状数组——人工湖题解

题目:人工湖 描述: [题目描述] 有一个湖,他的周围都是城市,每个城市都只和他相邻的两个城市有道路相连.假设有n个城市,编号1-n,公路是双向的,公路有时候是好的,有时候是坏的,现在询问你两个城市是否可以互相到达. [输入格式] 第一行两个数,一个2<=n<=100000  和 1<=m<=100000,分别代表城市数目和询问次数:接下来m行,每一行三个数f,a,b.f=0时,如果公路a,b之间的道路之前是好 的,现在就变成坏的,如果之前是坏的,现在就变成好的.f=1时,询问a,

[模板]树状数组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

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

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: 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

洛谷P3374 【模板】树状数组 1

P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:

洛谷 P3374 【模板】树状数组 1 如题(单点修改+区间查询)

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

洛谷 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]内每个数的和 输出格式: 输出包含若干行整数,即为所有操作2的结果

洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

洛谷题目传送门 emm...题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧. 就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233) 所有的值(包括初始a数组,操作1.3.4.5的k)全部先丢进去离散化 对于1操作查比它小的数,挑log棵线段树,找区间小于这个数的个数+1,这个还比较好像 操作2就是dynamic ranking,log棵线段树一起加减,像静态主席树求第k小一样跳,操作3 dynamic ranking里也有 操作4先