Дерево Фенвика Ява
Я пытался реализовать Fenwick Tree на Java, но не получил желаемого результата. Вот мой код:
import java.io.*;
import java.util.*;
import java.math.*;
class fenwick1 {
public static int N;
public static long[] a;
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
a = new long[N];
String[] str = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
a[i] = Long.parseLong(str[i]);
}
increment(2, 10);
System.out.println(a[2]);
System.out.println(query(4));
}
public static void increment(int at, int by) {
while (at < a.length) {
a[at] += by;
at |= (at + 1);
}
}
public static int query(int at) {
int res = 0;
while (at >= 0) {
res += a[at];
at = (at & (at + 1)) - 1;
}
return res;
}
}
Когда я даю вклад:
10
1 2 3 4 5 6 7 8 9 10
Я получил:
13
19
Так что функция приращения работает нормально. Но запрос (4) должен дать совокупную сумму до индекса 4, т.е.
(1 + 2 + 13 + 4 + 5) = 25
1 ответ
Решение
Вы не инициализируете это должным образом. Вместо:
for (int i = 0; i < N; i++) {
a[i] = Long.parseLong(str[i]);
}
Так должно быть:
for (int i = 0; i < N; i++) {
increment(i, (int)Long.parseLong(str[i]));
}
так как a[i]
следует хранить накопленную сумму, а не один элемент.
Если вы хотите сохранить исходные элементы массива, вы можете просто создать еще один массив:
long[] initA = new long[N];
for (int i = 0; i < N; i++) {
initA[i] = Long.parseLong(str[i]);
increment(i, (int)initA[i]);
}