额。。。今天打LCT的时候莫名其妙的RE了
很不爽,然后调代码。。。
调着调着发现一个天大的错误。。。
大概是这样的:
乃们平常都是这样写的
bool IsRoot(int x)
{
return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
然后因为我欠抽想用位运算,所以。。。
bool IsRoot(int x)
{
return (son[fa[x]][0]^x)&(son[fa[x]][1]^x);
}
然后就感觉自己很机智。。。
但一交上去,我就发现我RE了
。。。= =
直到调了几个小时之后想弃疗了
1756500824才告诉我,可能是位运算玩脱了
于是我就检查了一下
诶不对啊
比如。。。
x=1;
son[fa[x]][0]=4;
son[fa[x]][1]=11;
son[fa[x]][0]^1=5;
son[fa[x]][1]^1=10;
(son[fa[x]][0]^x)&(son[fa[x]][1]^x)=0;
FML!!!!!!!!!!!!!!!
所以其实就是我sb了
改成这样之后。。。就过了
bool IsRoot(int x)
{
return (bool)(son[fa[x]][0]^x)&(bool)(son[fa[x]][1]^x);
}
对了乃们知道到底用位运算快还是逻辑运算符快吗???
如果这样还比原来慢一些的话
那我就真的是闷声作大死了→_→