洛谷 P3374 【模板】樹狀數組 1 如題(單點修改+區間查詢)
阿新 • • 發佈:2017-11-05
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 如題(單點修改+區間查詢)