编程语言
首页 > 编程语言> > 【蓝桥杯算法练习题】树状数组与线段树

【蓝桥杯算法练习题】树状数组与线段树

作者:互联网

一、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