zoukankan      html  css  js  c++  java
  • 洛谷p3374 【模板】树状数组1(树状数组+单点更新+区间求和)

    题目描述

    如题,已知一个数列,你需要进行下面两种操作:

    1.将某一个数加上x

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

    输入格式

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

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

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

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

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

    输出格式

    输出包含若干行整数,即为所有操作2的结果。

    输入输出样例

    输入 #1
    5 5
    1 5 4 2 3
    1 1 3
    2 2 5
    1 3 -1
    1 4 2
    2 1 4
    输出 #1
    14
    16

    说明/提示

    时空限制:1000ms,128M

    数据规模:

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

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

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

    样例说明:

    故输出结果14、16

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAX=500005;
     4 int n,m,a[MAX],pre[MAX];
     5 
     6 int lowbit(int x){
     7     return x&(-x);
     8 }
     9 
    10 void add(int x,int v){
    11     while(x<=n){
    12         pre[x]+=v;
    13         x+=lowbit(x);
    14     }
    15 }
    16 
    17 int sum(int x){
    18     int ans=0;
    19     while(x>0){
    20         ans+=pre[x];
    21         x-=lowbit(x);
    22     }
    23     return ans;
    24 }
    25 
    26 int query(int x,int y){
    27     return sum(y)-sum(x-1);
    28 }
    29 
    30 int main(){
    31     int k,x,y;
    32     scanf("%d%d",&n,&m);
    33     for(int i=1;i<=n;i++){
    34         scanf("%d",&a[i]);
    35         add(i,a[i]);
    36     }
    37     for(int i=0;i<m;i++){
    38         scanf("%d%d%d",&k,&x,&y);
    39         if(k==1){
    40             add(x,y);
    41         }
    42         else{
    43             printf("%d
    ",query(x,y));
    44         }
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    使用AStyle进行代码格式化
    ubuntu14.04设置静态ip
    网络模拟器WANem使用配置图文教程
    ServerSocket 默认邦定IP
    shell判断文件是否存在
    linux文本模式下使用PPPOE拨号ADSL上网的方法
    几个国内速度最快的centos yum(更新源)
    linux命令执行返回值(附错误对照表)
    如何在java程序中调用linux命令或者shell脚本
    windows多线程详解
  • 原文地址:https://www.cnblogs.com/ChangeG1824/p/11844529.html
Copyright © 2011-2022 走看看