2024.7.13 模擬賽

心海秋的墨木仄發表於2024-07-13

int

將每一個浮點數乘上 \(10^9\),然後問題就可以轉化成,有多少對數的乘積至少包含 $18 $ 個末尾 \(0\)

然後計算每一個數的 \(2\)\(5\) 的因子數量。

統計一下 \(2\)\(5\) 因子數量和都不小於 \(18\) 的數對數量即可。

math

顯然要將所有數從大到小、從高位到低位依次填入,使高位的數儘量大。

可以貪心地選擇將當前的數字要填在哪一個中。

假設兩個數已填入的字首分別為 \(a,b\),當前數字為 \(c\)

若將 \(c\) 放在 \(a\) 後,乘積為 \((10a+c)b\)

若將 \(c\) 放在 \(b\) 後,乘積為 \((10b+c)a\)

相減得 \(c(b-a)\),我們要選擇較大的乘積,若 \(b>a\) 則將 \(c\) 放在 \(a\) 後,若 \(a>b\) 則將 \(c\) 放在 \(b\) 後這只是一個感性的分析,但可以啟示我們:將數放在當前較小的字首後

寫個暴力拍一拍,發現這樣會錯,需要加上一個補丁:當字首相等時,放在可填的剩餘位數較少的字首後這樣就可以了,比較大小與相乘的做法參考高精。

game

我們知道兩個人選的一定都是一段區間。考慮列舉 Alice 第一個落子的位置 \(X\),那麼最終的答案肯定是區間 \([L,R]\),其中 \(X \in [L,R]\)\(R - L + 1 = \lceil \frac{n}{2} \rceil\)

Bob 會盡量讓 Alice 選擇最差的區間。考慮最差的區間是否能被 Bob 逼出來。

假設第一次落子在 \(X\),最差答案為 \([L,R]\)。假設 Bob 會落子在 \(Y\)。我們需要讓除了 \([L,R]\) 之外的所有位置到 \(X\) 的距離比到 \(Y\) 的距離更長,這樣才能保證這些位置被 \(Y\) 控制。那麼 \(2L - X\) 就是一個極好的位置,如果 \(X\) 往一個方向延伸,我們對應把 \(Y\) 往這個方向延伸即可。也就是說,如果第一步下在 \(X\) 的位置,之後就會被逼到所有包含了 \(X\)\([L,R]\) 中,\(A_L + A_{L + 1} + \cdots + A_{R}\) 最小的位置。單調佇列維護這個東西即可。

以上描述全部在 \(\bmod N\) 意義下進行。

posters

\(k=1\) 時,直接輸出唯一一張海報面積即可。

\(k=2\) 時,注意到一定是貼在相對的兩個角旁邊最優,直接計算面積並。

\(k=3\) 時,我們發現一個性質:最大的海報貼在角落是最優的。那麼我們列舉剩下兩張海報左上角的座標,計算面積依然採用容斥原理。透過簡單的剪枝或者保證較小的常數均可透過這一檔的資料。

\(k=4\) 以及 \(k=5\) 的隨機資料時,最大的海報依然要貼在角落,但是直接列舉每張海報的座標已經不能忍受了,於是我們考慮如何對他進行最佳化。不難發現,最優的情況下,每張海報至少有兩條邊要貼著牆邊或者之前某張海報的邊緣。證明考慮反證法,假如不是最優,那麼朝著某個方向平移到邊上必然不會更劣而可能更優,假設不成立。因此每次都要貼著邊緣走,然後任意時刻至多 \(4k+4\) 條邊緣直線,每條直線長度至多 \(100\) 還不滿,因此如果採用搜尋的方式實現就能透過這一檔。

\(k=5\) 的非隨機資料,如果搜尋不夠優秀,那麼你可能會在不優的地方深挖下去導致超時,所以我們需要適當進行更多的剪枝。首先我們需要最優性剪枝,如果當前面積加上後面所有海報面積之和還沒有超過當前最優答案,直接剪掉。然後我們用 set 去維護每條邊緣,加速查詢。列舉和搜尋需要注意搜尋序,優秀的搜尋序可以使最優性剪枝的效果更加顯著。當然還有一些技巧,需要根據自己的程式實現進行最佳化。

綜合以上可以獲得滿分。

ring

考場思路修改打標記,詢問直接查詢區間內所有點,複雜度 \(\mathcal O(qn)\)

修改打標記,詢問查所有環對這個區間的貢獻,需要二分查詢和字首和,複雜度 \(\mathcal O(mn \log n)\)

兩者很不平衡,考慮分別操作,為了方便,我們假設 \(n,m,q\) 同數量級。把環大小超過和不超過 \(B\) 的環分別稱作大環和小環。大環數量不會超過 \(\frac{n}{B}\)

對小環的操作:暴力移位,維護區間和。樹狀陣列維護:修改 \(\mathcal O(B \log n)\),查詢 \(\mathcal O(\log n)\),很不平衡。改為分塊:修改 \(\mathcal O(B)\),查詢 \(\mathcal O(B + \frac{n}{B})\)

對大環的操作:同樣維護環上字首和,修改 \(\mathcal O(1)\),查詢 \(\mathcal O(\frac{n}{B} \log n)\)\(B\)\(\mathcal O(\sqrt {n \log n})\) 達到最優,複雜度為 \(\mathcal O(n\sqrt{n \log n})\)

然而複雜度不對。我們發現對大環的操作仍然很不平衡。如果要最佳化二分查詢,需要 \(\mathcal O(\frac{n^2}{B})\) 的空間。在 \(\text{32MB}\) 下,這是不現實的。但是我們可以離線!我們對於每個大環,跑所有詢問,預處理每個位置的 \(\rm{lower\_bound}\)。那麼只需要 \(\mathcal O(n)\) 的空間即可最佳化這個二分。取時間複雜度降為 \(\mathcal O(n\sqrt n)\)。(還是可以線上做,對於每個塊,維護經歷大環的移動後,塊內該大環最右邊和最左邊的點被移動到了什麼位置,同樣用字首和即可查詢,複雜度 \(\mathcal O(n \sqrt n)\))。