ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-03-19 14:33:28  阅读:171  来源: 互联网

标签:练习题 数列 树状 int res cin 蓝桥 100000 include


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有