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\n", 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

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

猜你喜欢

转载自www.cnblogs.com/yalphait/p/9828602.html
今日推荐