11.27 模擬賽

2huk發表於2024-11-27

覆盤

T1 一眼不會。模擬樣例的時候好像得到了一個對於每次詢問 \(\mathcal O(n)\) 做的暴力演算法。不太清楚。

畫了點圖。差不多得到一點想法。發現用 set 維護連通塊,總複雜度 \(\mathcal O(n \log^2 n)\),1e6 肯定過不去。但應該能過 80。寫寫試試。

然後寫了一坨。實際上這個時候思路還是很混亂的。

發現有一步不會寫,隨便蒙了個東西糊上去。顯然假。但是資料似乎挺水應該能騙不少分。(這時還不知道捆綁測試。)

2.5h 了趕緊往後看題。

T2 送了 \(10\) 分。部分分好像是倍增。先寫寫試試 \(m=1\) 的。

沒過手造樣例。擺了不調了,或許做法是假的。

T3 什麼玩意。

T4 送了 \(18\) 分。性質好像都不太會做。寫吧。

\(0+0+0+18\)

總結

不足:

  • T1 不會做。
  • T2 除錯沒刪。
  • T2 部分分不會做。
  • T4 性質不會做。

腦子跟被吃了一樣,啥也不會。

知識點

T1:數學

T2:倍增

題解

A. 排序

\(f(i,j)\)\(i,j\) 在二進位制下最高的不同位。

\(a_i \ne a_{i+1}\) 的情況下,如果想讓 \((a_i \oplus x) \le (a_{i+1} \oplus x)\),那麼 \(x\) 的第 \(f(a_i,a_{i+1})\) 二進位制位是唯一確定的。這取決於 \(a_i < a_{i+1}\) 還是 \(a_i > a_{i+1}\)

所以判斷矛盾就很好做了。

然後一次單調修改只會影響 \(\mathcal O(1)\) 個位置。這些位置重構即可。

真服了這麼簡單為啥想不到。真服了這麼簡單為啥想不到。真服了這麼簡單為啥想不到。

B. 交換

注意到對於 \(i_0=j,i_1=j+\operatorname{lcm}(n,m)\),有 \((b_{i_0 \bmod m}+i_0)\bmod n = (b_{i_1 \bmod m}+i_1)\bmod n\)

也就是說每 \(\operatorname{lcm}(n,m)\) 次操作後,交換的兩個數的位置是相同的。

所以求一個排列 \(p\) 表示第 \(i\) 個數經過 \(\operatorname{lcm}(n,m)\) 次操作後,\(a_i \gets a_{p_i}\)。用倍增讓它跳 \(\lfloor t/\operatorname{lcm}(n,m) \rfloor\) 次。最後剩下的 \(\operatorname{lcm}(n,m)\) 次暴力。

這玩意就能過 \(60\) 分。

真服了這麼簡單為啥想不到。真服了這麼簡單為啥想不到。真服了這麼簡單為啥想不到。

考慮正解。

首先如果 \(m\)\(n\) 的倍數那麼跟上面做法一樣。

考慮 \(m\) 不是 \(n\) 的倍數的情況。

——官方題解

注意力驚人的出題人。