Ví dụ:
int lấy(int i) {
int res = 0;
trong khi (i) {
res = (res + cây[i]) % MOD;
tôi -= ( (i) & (-i) );
}
trả về res;
}
Chức năng cập nhật cây:
void cập nhật(int i, int val) {
trong khi (i <= m) {
cây[i] = (cây[i] + giá trị) % MOD;
tôi += ( (i) & (-i) );
}
}
bạn có thể giải thích chúng bằng cách sử dụng mã không ( (tôi) và (-tôi) )
Có chuyện gì đã xảy ra à?
Hãy để tôi giả sử rằng các giá trị âm được biểu diễn bằng ký hiệu bù hai. trong trường hợp này,-Tôi
có thể được tính như (~tôi)+1
(lật bit rồi cộng 1).
Ví dụ, hãy để tôi xem xét tôi = 44
. Sau đó, ở dạng nhị phân,
tôi = 0000 0000 0000 0000 0000 0000 0010 1100
~tôi = 1111 1111 1111 1111 1111 1101 0011
-i = (~i)+1 = 1111 1111 1111 1111 1111 1101 0100
(i) & (-i) = 0000 0000 0000 0000 0000 0000 0000 0100
Như bạn có thể thấy, bạn có thể sử dụng (tôi) và (-tôi)
Bit nhỏ nhất được tính là 1.
Tôi là một lập trình viên xuất sắc, rất giỏi!