• 【UOJ 24】树状数组1


    【题目描述】:

    如题,已知有N个元素组成的数列(下标从1开始计数),你需要进行下面两种操作:

    1.将某一个数加上x

    2.求出某区间每一个数的和

    【输入描述】:

    第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

    第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

    接下来M行每行包含3个整数,表示一个操作,具体如下:

    操作1: 格式:1 x k 含义:将第x个数加上k

    操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

    【输出描述】:

    输出包含若干行整数,即为所有操作2的结果。(输出不超过int类型)

    【样例输入】:

    5 5
    1 5 4 2 3
    1 1 3
    2 2 5
    1 3 -1
    1 4 2
    2 1 4

    【样例输出】:

    14
    16

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    对于30%的数据:N<=8,M<=10

    对于70%的数据:N<=10000,M<=10000

    对于100%的数据:N<=100000,M<=100000

    题解:模板不解释。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    const int N=100003;
    int n,m,a,b,w,c[N];
    int low(int x){
        return x&(-x);
    }
    
    void update(int x,int v){
        while(x<=n){
            c[x]+=v;
            x+=low(x);
        }
    }
    
    int sum(int x){
        int ans=0;
        while(x>0){
            ans+=c[x];
            x-=low(x);
        }
        return ans;
    }
    int main(){
        freopen("24.in","r",stdin);
        freopen("24.out","w",stdout);
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&a);
            update(i,a);
        }
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&a,&b,&w);
            if(a==2) printf("%d
    ",sum(w)-sum(b-1));
            else update(b,w);
        }
        return 0;
    }
  • 相关阅读:
    052-34
    052-33
    052-32
    052-31
    052-30
    052-28
    react组件之间通信
    排序算法
    点外卖
    js的各种排序算法
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11195658.html
Copyright © 2020-2023  润新知