이 코드를 이해하려고 노력했습니다. 세그먼트 트리 데이터 구조의 변형을 사용하고 있지만이 코드의 비트 연산을 이해할 수 없다고 생각합니다.뒤집기 동전의 비트 작동
실제 문제는 N 코인있다이다 우리는 1 개 동작과
- 범위에서 경화를 반전한다 1 명 질의 [A가 B]
- 범위 헤드의 수를 찾아야 [A, B].
.
#define LEAVES (131072)
#define MSB_V (0x80000000)
#define MSB_P (31)
int it[2 * LEAVES];
int A, B; //Query range
void flip (int i, int min, int max)
{
if ((min > B) || (max <= A))
{ }
else if ((min >= A) && ((max-1) <= B))
{ it[i] ^= MSB_V; }
else
{
int l = 2 * i;
int r = l + 1;
int mid = (min + max)/2;
it[l] ^= it[i] & MSB_V;
it[r] ^= it[i] & MSB_V;
it[i] ^= MSB_V;
flip(l, min, mid);
flip(r, mid, max);
it[i] = (it[l] >> MSB_P ? mid - min - (it[l]^MSB_V) : it[l]) +
(it[r] >> MSB_P ? max - mid - (it[r]^MSB_V) : it[r]);
}
}
int count (int i, int min, int max)
{
int h;
if ((min > B) || (max <= A))
{ h = 0; }
else if ((min >= A) && ((max-1) <= B))
{ h = it[i] >> MSB_P ? max - min - (it[i]^MSB_V) : it[i]; }
else
{
int l = 2 * i;
int r = l + 1;
int mid = (min + max)/2;
it[l] ^= it[i] & MSB_V;
it[r] ^= it[i] & MSB_V;
it[i] ^= MSB_V;
it[i] = (it[l] >> MSB_P ? mid - min - (it[l]^MSB_V) : it[l]) +
(it[r] >> MSB_P ? max - mid - (it[r]^MSB_V) : it[r]);
h = count(l, min, mid) + count(r, mid, max);
}
return h;
}
누군가 나에게
비트를 뒤집기 위해 XOR'ing하는 것처럼 보입니다. 따라서 각 동전은 단일 비트 0/1 머리/꼬리로 표시됩니다. – Sysyphus
이 코드는 두 함수에서 모두 같은 오류가 있습니다 :'it [i]^= MSB_V; '뒤에'it [i] = (이전 값 it [i]와 무관 한 것)' –