CF2074C Xor and Triangle
给定 \(x\),求一个 \(y<x\) 使得 \(x,y,x\oplus y\) 构成非退化三角形。根据三角形不等式进行推导:
- \(x+y>x\oplus y \to x\oplus y+2(x\&y)>x\oplus y \to x\&y>0\);
- \(y+x\oplus y>x \to y+(x+y)-2(x\&y)>x \to y>x\&y\)。
所以所需条件是 \(y>x\&y>0\),即:
- 存在一位 \(x,y\) 同为 \(1\)(\(x\&y>0\));
- 存在一位 \(x\) 为 \(0\),\(y\) 为 \(1\)(\(y>x\&y\))。
枚举所有 \(\text{pop_count}=2\) 的数,判断是否满足上述条件且 \(x>y\)。如果找不到则输出 -1。复杂度 \(O(\log^2 x)\)。也可以枚举 \(x\) 的 \(0\) 位,再加一个 \(x\) 的 \(\text{lowbit}\)。
这个把加法拆成异或和与运算的操作似乎非常常用。比如在 CF2085C 中,给定 \(x,y\),要求找到一个 \(k\) 能满足 \((x+k)+(y+k)=(x+k)\oplus(y+k)\),若无解输出 -1。就可以考虑把左边拆成 \((x+k)\oplus(y+k)+2((x+k)\&(y+k))\),转化成求 \((x+k)\&(y+k)=0\) 的 \(k\)。不妨设 \(x\le y\),把 \(y\) 加到 \(2\) 的整次幂即可,简单二分。唯一的无解情况是 \(x=y\)。

浙公网安备 33010602011771号