2025.3.22

Problem - C - Codeforces

C. XOR and Triangle(位掩码)

请判断是否存在满足以下条件的整数 y。

  • y 严格小于 x 。
  • 存在一个边长为 x , y , x ⊕ y x \oplus y xy 的非退化三角形 。这里, ⊕ \oplus 表示 bitwise XOR 运算

此外,如果存在这样一个整数 y ,则输出任意一个。

思路

三角形:最小两边之和大于第三边

由于y<x,所以此题只需保证:

y+ x ⊕ y x \oplus y xy > x

x + y x+y x+y > x ⊕ y x\oplus y xy


行文至此,不得不提一下zx的至理名言

异或是不进位加法

所以一般情况下, x + y x + y x+y大于 x ⊕ y x \oplus y xy

  • x + y = x ⊕ y + 2 ( x & y ) x+y=x \oplus y+2(x\&y) x+y=xy+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 。
  1. y y y包含至少一个在 x x x中打开的位
    这意味着 y y y至少有一个位与 x x x的某一位相同,即 y & x ≠ 0 y \& x \neq 0 y&x=0
  2. y y y至少包含一个在 x x x中未开启的位
    这意味着 y y y至少有一个位是 x x x中没有的,即 y & ¬ x ≠ 0 y \& \neg x \neq 0 yx=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 / %

±

<< >>

< <= > >=

== !=

&

^

|

&&

||

?:

+= = /= 等赋值运算符

Logo

集算法之大成!助力oier实现梦想!

更多推荐