我試圖理解這段代碼。我認爲它使用了段樹數據結構的一些變體,但我無法理解此代碼中的任何位操作。翻轉硬幣的位操作
的實際問題是,有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] =(與舊值無關的東西[i])' –