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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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 }

 

以上是关于洛谷 P3374 模板树状数组 1 题解的主要内容,如果未能解决你的问题,请参考以下文章

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

洛谷——P3374 模板树状数组 1

洛谷 P3374 模板树状数组 1

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

洛谷P3374 模板树状数组 1(CDQ分治)

P3374 模板树状数组 1(单点修改区间查询)(树状数组)