数列操作

    科技2024-01-17  98

    测试地址:

    【题目描述】

    给定 n 个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。数列元素个数最多10 万个,询问操作最多1010万次。

    【输入】

    第一行 2 个整数 n,m ( n 表示输入 n 个数,m 表示 m 操作)

    第二行 n 个整数

    接下来 m 行,每行三个数 k,a,b ( k=0 ,表示求子数列 [a,b] 的连续和;k=1,表示第 a 个数加 b)。

    【输出】

    若干行,表示 k=0 时,对应子数列 [a,b] 连续和。

    【输入样例】

    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

    【思路】

    一道模板题,直接套用即可,可参考 树状数组 

    【AC代码】

    #include<cstdio> const int maxn=1e6+7; int c[maxn]; int n, m, x; int Lowbit(int x){ return x&(-x); } void update(int x, int y){ for(int i = x; i <= n; i+=Lowbit(i)) c[i] += y; } int sum(int x){ int sumn=0; for(int i = x; i > 0; i-=Lowbit(i)) sumn += c[i]; return sumn; } int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ scanf("%d", &x); update(i, x); } while(m--){ int k, a, b; scanf("%d%d%d", &k, &a, &b); if(k == 1){ update(a, b); } else{ printf("%d\n", sum(b)-sum(a-1)); } } return 0; }

     

    Processed: 0.017, SQL: 8