1. 程式人生 > >洛谷 P3374 【模板】樹狀數組 1 如題(單點修改+區間查詢)

洛谷 P3374 【模板】樹狀數組 1 如題(單點修改+區間查詢)

ace hold reg gif sticky too aps urn cnblogs

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 }
單點修改+區間查詢

洛谷 P3374 【模板】樹狀數組 1 如題(單點修改+區間查詢)