The 2nd Universal Cup Semifinals

Rainbow_qwq發表於2024-07-03

D. Solar Panel Grid Optimization

考慮將最後一列不停旋轉,然後向左邊推數進去,對每一行推了 \(n-1\) 次後,左邊的所有 \(n-1\) 列的元素就匹配了。

具體操作是:從第 \(1\)\(n-1\) 列一列列考慮,先把符合 \(b\) 的推進去,然後把最後一列轉 \(n\) 次,再把剩下的推進去。

發現這樣做直接花掉了 \(2n^2\) 次操作。

這樣做完最後一列的元素 \(a_{i,n}\) 會 xor 上 \(\oplus (a_{i,j}\oplus b_{i,j})\),可能還有額外的全部翻轉一次。但這樣並不一定等於 \(b_{i,n}\)

考慮寫點亂搞,列舉每一列轉若干下,這樣這一列對於最終狀態的貢獻會改變。寫個狀壓 DP 最小化轉的次數,發現就過了。

大膽猜測隨機打亂、寫點線性基亂搞也能過。

E. Fast Median Transform

每次操作是將 \(x\) 向一個區間 \([\min(a_{i},b_{i}),\max(a_{i},b_{i})]\) 內縮合(\(x\to \text{clamp}(x,l,r)\))。

從後向前考慮,相當於有 \(nm\) 個區間 \([\min(a_{i},b_{i}),\max(a_{i},b_{i})]\),每次會區間取交一下,如果區間變成空的答案就確定了;如果一直不是空區間,則答案就是 \(\text{clamp}(x,l,r)\)

那我們就要求出 區間變成空的 那個時刻的資訊,或者這個區間最後是什麼。

考慮到只修改 \(a\) 陣列,我們先把 \(a\) 陣列和 \(b\) 匹配 \(n\) 輪,讓每個 \(a\) 都被匹配到。如果這 \(n\) 輪下去區間不為空,則 \(a\) 的每個位置作為 \(l\) 還是作為 \(r\) 是可以確定的(如果之後過程中某個數一次作為 \(l\),一次作為 \(r\),區間就為空了)。

我們又能發現一些其他性質,下面描述一下。

1:只要匹配了最後的 \(\max(2n,2m)\) 次(每個數被匹配了至少兩次),如果此時區間仍然不為空,那之後也不會為空了。

\(n=m\) 則顯然。對於 \(n\ne m\),考慮每個數在第一次匹配的時候就能確定它是 \(l\) 還是 \(r\),下一輪的時候,每個置換環會移動一位。經過一些討論,發現了結論

2:考慮一個 \(a_i\) 前一次匹配了 \(b_x\),後一次匹配了 \(b_y\),那麼在後一次的時候 \([\min(b_x,b_y),\max(b_x,b_y)]\) 這個區間的數一定已經爆了(指在維護的那個區間外)。

正確性顯然,這也同時能說明上一個結論。

在第一輪過後,顯然每次區間取交只會排除某個區間 \([b_x,b_y]\) 的數。由於這個結論只和 \(b\) 有關,可以忽略 \(a\) 的影響,提前預處理出每個數最早在什麼時間爆了。這可以用並查集維護區間覆蓋得到。

於是不難知道 \(x\) 是在某個時間爆了,還是直到最後都沒有爆。時間複雜度 \(O(q\log n)\)

相關文章