
Codeforces Round 1009 (Div. 3) C(位掩码)
行文至此,不得不提一下zx的至理名言。 “异或是不进位加法”这就是位屏蔽的神奇。注意:运算符的优先级。
2025.3.22
C. XOR and Triangle(位掩码)
请判断是否存在满足以下条件的正整数 y。
- y 严格小于 x 。
- 存在一个边长为 x , y , x ⊕ y x \oplus y x⊕y 的非退化三角形 。这里, ⊕ \oplus ⊕ 表示 bitwise XOR 运算。
此外,如果存在这样一个整数 y ,则输出任意一个。
思路
三角形:最小两边之和大于第三边
由于y<x,所以此题只需保证:
y+ x ⊕ y x \oplus y x⊕y > x
x + y x+y x+y > x ⊕ y x\oplus y x⊕y
行文至此,不得不提一下zx的至理名言
异或是不进位加法
所以一般情况下, x + y x + y x+y大于 x ⊕ y x \oplus y x⊕y。
- x + y = x ⊕ y + 2 ( x & y ) x+y=x \oplus y+2(x\&y) x+y=x⊕y+2(x&y)
这就是位屏蔽的神奇。
- x+y>x⊕y , (x⊕y)+2(x&y)>x⊕y , x&y>0 ;
- y+(x⊕y)>x , y+(x+y)−2(x&y)>x , y>x&y 。
-
y
y
y包含至少一个在
x
x
x中打开的位
这意味着 y y y至少有一个位与 x x x的某一位相同,即 y & x ≠ 0 y \& x \neq 0 y&x=0。 -
y
y
y至少包含一个在
x
x
x中未开启的位
这意味着 y y y至少有一个位是 x x x中没有的,即 y & ¬ x ≠ 0 y \& \neg x \neq 0 y&¬x=0,其中 ¬ x \neg x ¬x表示x的按位非。
寻找满足条件的最小
y
y
y
为了找到满足上述条件的最小的
y
y
y,我们可以考虑只有两个位被打开的情况,一个在
x
x
x中,另一个不在。这样,我们只需要检查所有可能的两位组合,这是一个
O
(
log
2
x
)
\mathcal{O}(\log^2 x)
O(log2x)的时间复杂度,因为x的位长度是
log
2
x
\log_2 x
log2x。
void solve()
{
int x,ans=-1;
cin>>x;
fir(i,0,30)
fir(j,0,30)
{
int p=(1<<i)|(1<<j);
if((p<x)&&((x&p)!=0)&&((p&(~x))!=0))
ans=p;
}
cout<<ans<<'\n';
}
注意:运算符的优先级
x / %
±
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
+= = /= 等赋值运算符
更多推荐
所有评论(0)