Problem 1008. Hilarity
Brief description:
给定一颗边权树,求一条路径,最大化异或和。
Analysis:
Tire + 贪心 。)
(边表用 vector 会 TLE。)
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=2815893
See also http://www.codechef.com/viewsolution/4993836
//}/* .................................................................................................................................. */
const int N = int(1e5) + 9, LV = 31;
int n;
void _r(int &x){
x=reverse_bits(x); x>>=1;
}
namespace T{
int trans[N*LV][2];
int nn;
int new_node(){
RST(trans[nn]);
return nn++;
}
#define v trans[u][c]
void Insert(int x){
_r(x); int u = 0; REP(i, LV){
int c = x & 1; x >>= 1;
if (!v) v = new_node();
u = v;
}
}
int Query(int x){
int z = 0, u = 0; _r(x); REP(i, LV){
int c = (x & 1) ^ 1; x >>= 1; z <<= 1;
if (!v) c ^= 1; else z |= 1;
u = v;
}
return z;
}
void Init(){
nn = 0; new_node();
}
};
#define aa to[i^1]
#define bb to[i]
#define v bb
#define w ww[i/2]
const int M = N*2;
int hd[N], suc[M], to[M], ww[N];
int Xor[N], maxXor;
void dfs(int u = 0, int p = -1){
T::Insert(Xor[u]);
checkMax(maxXor, T::Query(Xor[u]));
REP_G(i, u) if (v != p){
Xor[v] = Xor[u] ^ w;
dfs(v, u);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
while (~scanf("%d", &n)){
fill(hd, hd+n, 0); FOR_C(i, 2, n<<1){
RD(aa, bb, w);
suc[i] = hd[aa], hd[aa] = i++;
suc[i] = hd[aa], hd[aa] = i;
}
maxXor = 0; T::Init(); dfs();
OT(maxXor);
}
}




Alca
Amber
Belleve Invis
Chensiting123
Edward_mj
Fotile96
Hlworld
Kuangbin
Liyaos
Lwins
LYPenny
Mato 完整版
Mikeni2006
Mzry
Nagatsuki
Neko13
Oneplus
Rukata
Seter
Sevenkplus
Sevenzero
Shirleycrow
Vfleaking
wangzhpp
Watashi
WJMZBMR
Wywcgs
XadillaX
Yangzhe
三途川玉子
About.me
Vijos
