題意:有這樣的乙個需求,乙個程式能夠動態的插入數字,並且能夠以很快的速度給出乙個數字在已有的數字集合中異或之後值的最大或者是最小值。
解法:將插入的數構成一棵字典樹,然後將每乙個數字以貪心的思想去匹配,如果乙個數字為1010,要求與它異或之後值的最小值,只需要在為1的地方優先匹配1,為0的地方優先匹配0;如果是求最大值就把這個數字進行取反操作,然後找出乙個數與取反之後的數異或值最小即可。
**如下:
#include #include#include
#include
#include
using
namespace
std;
int mask[32
], idx;
struct
node
}e[32*10005
];void
pre()
//使用mask就能夠用來快速求出某一位是否為1
}void insert(int p, int lev, int
val)
bool r = val & mask[lev]; //
指出是否為1
if (e[p].ch[r] == -1
) insert(e[p].ch[r], lev-1
, val);
}int search(int p, int lev, int
val)
bool r = val &mask[lev];
if (e[p].ch[r] != -1
) else
}int
main() else
if (op[2] == '
i')
else }}
return0;
}
Acdream 1063 平衡樹 字典樹)
關鍵在於維護,從0節點開始左邊1右邊0,每個節點有個節點值,然後查詢的時候從頭還是乙個乙個找,如果在最優解下存在就走那個節點,否則走另外的節點。include include include includeusing namespace std int nex 3200010 2 int no 20...
AcDream 1084 同心樹 幾何
題意 下圖給定邊長l和旋轉角度a,求重疊之後的面積。解法 由於紫色的角已知是45度,加上a已知,可以推出phi等於a,設紅色邊長度為x,有x x cos a x sin a l,根據公式得到x l 1 cos a cos a 由於四個多出來三角形面積和形狀都相同,因此重合的面積為l l 1 2 x ...
AcDream 1084 同心樹 幾何
題意 下圖給定邊長l和旋轉角度a,求重疊之後的面積。解法 由於紫色的角已知是45度,加上a已知,可以推出phi等於a,設紅色邊長度為x,有x x cos a x sin a l,根據公式得到x l 1 cos a cos a 由於四個多出來三角形面積和形狀都相同,因此重合的面積為l l 1 2 x ...