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\)

posted @ 2025-03-12 12:22  XYukari  阅读(60)  评论(0)    收藏  举报