【蓝桥杯算法练习题】树状数组与线段树
作者:互联网
一、AcWing 1264. 动态求连续区间和
【题目描述】
给定
n
n
n个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列
[
a
,
b
]
[a,b]
[a,b]的连续和。
【输入格式】
第一行包含两个整数
n
n
n和
m
m
m,分别表示数的个数和操作次数。
第二行包含
n
n
n个整数,表示完整数列。
接下来
m
m
m行,每行包含三个整数
k
,
a
,
b
k,a,b
k,a,b(
k
=
0
k=0
k=0,表示求子数列
[
a
,
b
]
[a,b]
[a,b]的和;
k
=
1
k=1
k=1,表示第
a
a
a个数加
b
b
b)。
数列从
1
1
1开始计数。
【输出格式】
输出若干行数字,表示
k
=
0
k=0
k=0时,对应的子数列
[
a
,
b
]
[a,b]
[a,b]的连续和。
【数据范围】
1
≤
n
≤
100000
1≤n≤100000
1≤n≤100000
1
≤
m
≤
100000
1≤m≤100000
1≤m≤100000
1
≤
a
≤
b
≤
n
1≤a≤b≤n
1≤a≤b≤n
数据保证在任何时候,数列中所有元素之和均在
i
n
t
int
int范围内。
【输入样例】
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
【输出样例】
11
30
35
【分析】
树状数组模板题~
【代码】
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int c[N];
int n, m;
int lowbit(int x)
{
return x & -x;
}
void add(int x, int y)
{
for (; x <= n; x += lowbit(x)) c[x] += y;
}
int ask(int x)
{
int res = 0;
for (; x; x -= lowbit(x)) res += c[x];
return res;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) { int x; cin >> x; add(i, x); }
while (m--)
{
int k, a, b;
cin >> k >> a >> b;
if (!k) cout << ask(b) - ask(a - 1) << endl;
else add(a, b);
}
return 0;
}
标签:练习题,数列,树状,int,res,cin,蓝桥,100000,include 来源: https://blog.csdn.net/m0_51755720/article/details/123594204