1. 程式人生 > >Codeforces #1063C Dwarves, Hats and Extrasensory Abilities

Codeforces #1063C Dwarves, Hats and Extrasensory Abilities

相同 ORC 找到 黑點 程序 整數 坐標 完全 bili

題目大意

交互題。
輸出平面上的一個點的坐標,交互程序給這個點染色(白或黑)。
如此重復 $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)$ 兩點的直線。

Codeforces #1063C Dwarves, Hats and Extrasensory Abilities