1. 程式人生 > 其它 >【題解】CF1336D Yui and Mahjong Set

【題解】CF1336D Yui and Mahjong Set

給一個稍微複雜點的做法()。 考慮用 $\mathbf{triplet}$ 為輔確定單個元素,$\mathbf{straight}$ 為主求解。首先將問題以 $n$ 的奇偶性分成兩種情況,然後可以注意到兩個點: - 問某個 $a_i$ 第兩次後一定能確定它的值。 - 當知道某個 $a_i$ 是否為 $0$ 時,只需要問一次就可以知道它的值。 那麼首先考慮 $n$ 是奇數的情

給一個稍微複雜點的做法()。

考慮用 \(\mathbf{triplet}\) 為輔確定單個元素,\(\mathbf{straight}\) 為主求解。首先將問題以 \(n\) 的奇偶性分成兩種情況,然後可以注意到兩個點:

  • 問某個 \(a_i\) 第兩次後一定能確定它的值。
  • 當知道某個 \(a_i\) 是否為 \(0\) 時,只需要問一次就可以知道它的值。

那麼首先考慮 \(n\) 是奇數的情況:

  • 首先問所有偶數,保證此時所有偶數上的值大於 \(0\) 。注意問 \(a_2\) 的時候需要保證 \(a_4\) 大於 \(0\),問 \(a_{n-1}\) 的時候需要保證 \(a_{n-3}\)
    大於 \(0\)
  • 此時借用 \(a_2\) 的結果判斷 \(a_3\) 是否夠等於 \(0\),用 \(a_{n-1}\) 的結果判斷 \(a_{n-2}\) 是否等於 \(0\),然後花兩次詢問確定 \(a_3,a_{n-2}\)
  • 接著將除去 \(a_{n-1}\) 之外的所有偶數都問一遍確定值,然後用 \(a_4,\cdots a_{n-5}\) 的結果求得 \(a_{5}\cdots a_{n-4}\),再用 \(a_{n-3}\) 的結果求出 \(a_{n-1}\)
  • 最後用原來 \(a_{3},a_{n-2}\) 的結果求出 \(a_{1},a_{n}\),總共恰好花費 \(n\)
    次操作,注意 \(n=5,7\) 的情況。

然後考慮 \(n\) 是偶數的情況:

  • 首先詢問所有的偶數,注意仍然要最後問 \(a_2,a_n\)
  • 再問一次 \(a_{n-2}\),得到 \(a_{n-2}\) 的值,然後通過 \(a_{n}\) 的結果求得 \(a_{n-1}\) 的值。(如果 \(a_{n-1}=0\) 就很難繼續做,處理方式是再問一次 \(a_{n}\) 然後同時去掉後兩項,注意不要刪到只剩下兩個,然後特殊處理 \(n=4\) 的情況)。
  • 問出 \(a_3\),然後再問一遍所有除 \(a_{n},a_{n-2}\) 以外的所有偶數,求出之間的所有奇數。
  • 最後求出 \(a_{1}\)
    即可。

程式碼:Submission #145298385 - Codeforces