zoukankan      html  css  js  c++  java
  • 18.10.22 luoguP3374 【模板】树状数组 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 <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <stack>
     5 #include <string>
     6 #include <math.h>
     7 #include <queue>
     8 #include <stdio.h>
     9 #include <string.h>
    10 #include <vector>
    11 #include <fstream>
    12 #include <set>
    13 #define lowbit(x) x&(-x)
    14 
    15 using namespace std;
    16 int n, m;
    17 const int maxn = 500005;
    18 int num[maxn],sum[maxn],c[maxn];
    19 
    20 void build() {
    21     for (int x = 1; x <= n; x++)
    22     {
    23         sum[x] = sum[x - 1] + num[x];
    24         int lowb = lowbit(x);
    25         c[x] = sum[x] - sum[x - lowb];
    26     }
    27 }
    28 
    29 void change(int x,int k) {
    30     while (x <= n) {
    31         c[x] =c[x]+k;
    32         x += lowbit(x);
    33     }
    34 }
    35 
    36 int getsum(int x) {
    37     int sum=0;
    38     while (x > 0) {
    39         sum = sum + c[x];
    40         x -= lowbit(x);
    41     }
    42     return sum;
    43 }
    44 
    45 void query(int x, int y) {
    46     int sumx, sumy;
    47     sumx = getsum(x-1), sumy = getsum(y);
    48     int res = sumy - sumx;
    49     printf("%d
    ", res);
    50 }
    51 
    52 void init() {
    53     scanf("%d%d", &n, &m);
    54     for (int i = 1; i <= n; i++) {
    55         int x;
    56         scanf("%d", &x);
    57         num[i] = x;
    58     }
    59     build();
    60     while (m--) {
    61         int oper;
    62         scanf("%d", &oper);
    63         if (oper == 1) {
    64             int x, k;
    65             scanf("%d%d", &x, &k);
    66             change(x, k);
    67         }
    68         else {
    69             int x, y;
    70             scanf("%d%d", &x, &y);
    71             query(x, y);
    72         }
    73     }
    74 }
    75 
    76 int main()
    77 {
    78     init();
    79     return 0;
    80 }
    View Code

    原来高性能跟高精度不是一个意思?!

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/yalphait/p/9828602.html
Copyright © 2011-2022 走看看