题意
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
输出样例:
11
30
35
常规方法可能会出现超时的情况,因此采用树状的数组来存储这个和,时间满足;
常规方法:
import java.util.*;
public class Main{
public static void main(String[] agrs){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int []num = new int[n+1];
for(int i = 1; i<=n; i++){
num[i] = num[i-1] + in.nextInt();
}
for(int i = 0 ; i < m; i++){
int [] cur = new int[3];
cur[0] = in.nextInt();
cur[1] = in.nextInt();
cur[2] = in.nextInt();
if(cur[0]==0){
System.out.println(num[cur[2]]-num[cur[1]-1]);
}else if(cur[0]==1){
while(cur[1]<=n){
num[cur[1]]+=cur[2];
cur[1]++;
}
}
}
}
}
改进方法:
import java.util.*;
public class Main{
static int n;
static int m;
static int []cur = new int[100100];
public static void main(String[] agrs){
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int []num = new int[n+1];
for(int i = 1; i<=n; i++){
num[i] = in.nextInt();
add(i,num[i]);
}
int []k = new int[3];
for(int j = 0; j < m; j++){
k[0] = in.nextInt();
k[1] = in.nextInt();
k[2] = in.nextInt();
if(k[0]==0){
System.out.println(summ(k[2])-summ(k[1]-1));
}else{
add(k[1],k[2]);
}
}
}
public static void add(int x,int y){
for(int i = x; i <= n; i+=i&(-i)){
cur[i]+=y;
}
}
public static int summ(int x){
int res=0;
for(int i = x; i > 0; i-=i&(-i)){
res+=cur[i];
}
return res;
}
}