Codeforces #1063C Dwarves, Hats and Extrasensory Abilities

题目大意

交互题。
输出平面上的一个点的坐标,交互程序给这个点染色(白或黑)。
如此重复 $n$ 次($ 1\le n \le 30$)。
要求输出的 $n$ 个点各不相同,并且不论交互程序怎样给它们染色,都能找到一条直线将白点和黑点隔开(分隔线不能通过染色的点)。
输出分隔线上的两个点的坐标。

要求:输出的所有坐标都必须是 $0$ 到 $10^9$ 之间的整数。

解法

不难想到可以将 $n$ 个点都选在一条平行于 $x$ 轴的直线上。

每次都取中间两个相邻的黑白点的连线的中点。

由于纵坐标是一个常数,下面我们只考虑横坐标。

将第一个点的(横)坐标选为 $0$,不妨设第一个点被赋予白色,此时我们假想 $10^9+1$ 处是一个(虚拟的)黑点。
每次选取相临的两个黑白点连线的中点 $ l + (r - l) / 2$ 或者 $(l+r)/2$(注意:这种写法有溢出的风险)。

比赛时我的思路大体是对的,只是在最后输出分隔线时,我选择的是垂直于 $x$ 轴的直线,令其与 $x$ 轴交于 $(l + 1, 0)$,$l$ 是最右侧的白点的横坐标。

但是我没考虑到一种情况,那就是中间相邻的那两个黑白点的距离有可能是 $1$(这是由于 $2^{30} > 10^9+1$ 。实际上,若令 $x = 10^9 + 1$,将 $x\gets \lceil x /2 \rceil$ 反复执行 $29$ 次,必然有 $x = 1$;将 $x \gets \lfloor x/2 \rfloor$ 反复执行 $29$ 次也必然有 $x = 1$),此时分隔线恰经过最左侧的黑点。容易看出,分隔线若与 $x$ 轴垂直就在黑白点所在的水平线上占了一个位置(总共有 $10^9 + 1$ 个位置)。我们完全可以选择一条直线作为分隔线,由于最后必然有 $l < r$,我们可以令黑白点的纵坐标为 $1$,这样分隔线就可取为通过 $(l, 0)$ 和 $(r, 2)$ 两点的直线。

猜你喜欢

转载自www.cnblogs.com/Patt/p/9788712.html