洛谷 P3374 【模板】树状数组 1 如题(单点修改+区间查询)

P3374 【模板】树状数组 1

  • 时空限制1s / 128MB

题目描述

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

1.将某一个数加上x

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

输入输出格式

输入格式:

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

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

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

操作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

-------------------------------------------------------------------------------------------------------------

推一篇博客:http://blog.csdn.net/qq_21841245/article/details/43956633

非常本职的树状数组,存个板子

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 500010
 4 int delta[maxn],n,m,sum[maxn];
 5 int read();
 6 int find(int);
 7 void add(int,int);
 8 int lowbit(int);
 9 int main(){
10     n=read();m=read();
11     for(int i=1;i<=n;i++){
12         int a=read();
13         sum[i]=sum[i-1]+a;
14     }
15     for(int i=1;i<=m;i++){
16         int o=read(),x=read(),y=read();
17         if(o==1) add(x,y);
18         else{
19             int ans=find(y)-find(x-1)+sum[y]-sum[x-1];
20             printf("%d\n",ans);
21         }
22     }
23     return 0;
24 }
25 int find(int x){
26     int SUM=0;
27     while(x>0){
28         SUM+=delta[x];
29         x-=lowbit(x);
30     }
31     return SUM;
32 }
33 void add(int x,int k){
34     while(x<=n){
35         delta[x]+=k;
36         x+=lowbit(x);
37     }
38 }
39 int lowbit(int x){
40     return x&-x;
41 }
42 int read(){
43     int ans=0,f=1;char c=getchar();
44     while(‘0‘>c||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
45     while(‘0‘<=c&&c<=‘9‘)ans=ans*10+c-48,c=getchar();return ans*f;
46 }

单点修改+区间查询

时间: 2024-10-11 05:57:43

洛谷 P3374 【模板】树状数组 1 如题(单点修改+区间查询)的相关文章

hdu 1541/poj 2352:Stars(树状数组,经典题)

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4052    Accepted Submission(s): 1592 Problem Description Astronomers often examine star maps where stars are represented by points on a plan

poj 3321:Apple Tree(树状数组,提高题)

Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been

洛谷 P3368 【模板】树状数组 2 如题(区间修改+单点查询)

P3368 [模板]树状数组 2 时空限制1s / 128MB 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含2或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x 含义:输出

[模板]树状数组1/ZKW线段树

https://www.luogu.org/problemnew/show/P3374 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define rson (o<<1|1) 5 #define lson (o<<1) 6 const int N = 530000<<1;//zkw线段树只能查询(0,bit),所以只有bit-2个叶节点,bit-2<n

[模板]树状数组

OJ题号:洛谷P3374 1 #include<cstdio> 2 #include<cstring> 3 #define maxn 500000 4 int n,m; 5 struct BIT { 6 int val[maxn]; 7 BIT() { 8 memset(val,0,sizeof val); 9 } 10 int lowbit(int x) { 11 return x&-x; 12 } 13 void modify(int p,const int x) {

二维树状数组(水题) POJ1195

前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用线段树想一想其实只是线段树编号不同而已,本质类似) 写了下二维树状数组,几乎和一维相同,也没必要不同. #include <cstdio> #include <cstring> int l,r,x,y,n,a,p,sum[1125][1125]; inline int lowbit(i

Apple Tree POJ - 3321 dfs序列构造树状数组(好题)

There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree. The tree has N forks which are connected by branches. Kaka numbers

树状数组2 - 区间加 单点求和

树状数组 = O(logn) 单点修改 ,O(logn) 区间查询 如果要做到 区间修改 单点查询 我们就要加入差分的思想 用树状数组记录数组的差分 然后对差分进行前缀和就可以得到单点的数据 //ios::sync_with_stdio(false); #include<bits/stdc++.h> #define ll long long using namespace std; const int MAXN = 500010; int n,m; ll C[MAXN]; ll lowbit(

[模板]树状数组2

https://www.luogu.org/problemnew/show/P3368 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 #define lowbit(a) (a&(-a)) 6 7 int n, m, t[500010], bas[500010]; 8 9 inline void update(int x, int