XXII Open Cup. Grand Prix of Korea


鏈接

A B C D E F G H I J K L M
\(\color{green}{\texttt{+1}}\) \(\color{red}{\texttt{+3}}\) \(\color{green}{\texttt{+1}}\) \(\color{red}{\texttt{+}}\) \(\color{gray}{\texttt{+}}\) \(\color{red}{\texttt{+}}\) \(\color{gray}{\texttt{+1}}\) \(\color{gray}{\texttt{+}}\) \(\color{green}{\texttt{+}}\)

J. Periodic Ruler

簽到題。

H. Or Machine

對於整周期我們按位處理,記錄一個數字至少多少輪后該位變成 \(1\)。這本質上是一個最短路,而且有效轉移邊邊權只有 \(0\)\(1\)

對於散周期暴力處理即可。復雜度 \(O(l+n\log V)\)

C. Equivalent Pipelines

考慮 Kruskal 求最小瓶頸路的過程:從大到小加入一條邊,其連接的兩個集合之間的最小瓶頸路就是該邊邊權。

那么顯然的想法就是枚舉權值,將該權值連接的點集記錄下來。可以發現這個過程可以用 Hash 實現:定義一個點集 Hash 函數為其所有點的 Hash 之和,連接兩個點集的 Hash 值為兩個點集 Hash 之積乘上邊權。容易證明這個 Hash 函數與上述點集描述是等價的。

E. Goose Coins

容易證明,假設不考慮硬幣數量限制,那么對於任何有解的情況,從大往小貪心地能取就取一定可以恰好達到目標方案。而此時的硬幣數量一定是最小的。

同時也容易發現,任何方案可以用上述方案通過將若干 \(c_i\) 硬幣換成 \(\frac{c_i}{c_{i-1}}\)\(c_{i-1}\) 硬幣得到。

考慮 dp,用 \(f_{i,j,k}\) 表示當前在 \(i\) 位置,已經放了 \(j\) 個硬幣,\(c_i\) 硬幣還有 \(k\) 個的最小/最大重量。枚舉 \(i\) 硬幣分裂幾次,可以得到一個 \(O(nk^3)\) 的 dp。事實上可以通過。

事實上我們並不關心當前位置到底有多少個硬幣,而關心的是當前位置是否存在 \(l\) 個硬幣。所以我們可以不必枚舉 \(k\) 而是簡單地后綴 \(\min\),這樣復雜度就變成 \(O(nk^2)\)

K. Three Competitions

容易發現,如果把 \(i\) 直接擊敗 \(j\) 看做邊 \(i\rightarrow j\),那么這是一張競賽圖。而競賽圖的一大性質是:給定每個點的出度,可以得到 scc(強連通分量)。

具體來說,將所有點按照出度排序,可以證明如果兩個點不在一個 scc 中,出度小的一定在前面,並且一個 scc 的所有點構成一個區間。

這樣考慮如果一個區間中的點構成一個環,當且僅當加入這個環前是合法的競賽圖(出度之和 \(=\frac{n(n-1)}2\)),加入之后是合法的競賽圖,且任何一個真前綴都不是合法的競賽圖。直接掃一遍即可判斷 scc。

最后求每個點出度可以直接二維偏序減三維偏序。復雜度 \(O(n\log^2 n)\)

A. Automatic Sprayer 2

大概就是根據二階差分之后結果確定除去第一行和最后一行的所有行上數字之和。

同樣也可以確定第一列和最后一列的所有行上數字之和。

然后列方程手動解出第一行和最后一行。

最后構造直接貪心,可以證明如果有解一定可以用貪心構造。

賽時題解
容易構造使矩陣只有唯一解,所以不用想一些亂搞了。  
令 X1|X2|X3|X4|... 表示第 1 行 1,2,3... 列的情況  
令 a1,a2... 表示第 1,2,... 列的總數  
X1=a2+2a3+3a4+...+W  
X2=a1+a3+2a4+...+W  
X3=2a1+a2+a4+...+W  
X4=3a1+2a2+a3+...+W  
D1=S1-S2=-a1+a2+a3+a4+...  
D2=S2-S3=-a1-a2+a3+a4+...  
D3=S3-S4=-a1-a2-a3+a4+...  
D1-D2=2a2  
D2-D3=2a3  
...  
可以求出 a2,a3,...,an-1  
同理 b2,b3,...,bn-1  
考慮求出 a1,an,b1,bn  
可以發現的是:  
S(n,n)=Xn+Yn=(n-1)a1+(n-1)b1+C1  
S(n,1)=Yn+X1=(n-1)a1+(n-1)bn+C2  
S(1,n)=Xn+Y1=(n-1)an+(n-1)b1+C3  
S(1,1)=X1+Y1=(n-1)an+(n-1)bn+C4  
看起來有 4 個方程,然而是線性相關的。。。最后一個方程可以用前三個表示。  
因為少了一個等式:行的點數之和等於列的點數之和。  
換句話說 X1+Xn=Y1+Yn+D  
這樣等式就齊了。  
令 R1=C1-S(n,n) , R2=C2-S(n,1) , R3=C3-S(1,n)  
(n-1)a1=(2R1+R2-R3+D)/4  
(n-1)an=(-2R1+R2-3*R3+D)/4  
(n-1)b1=(2R1-R2+R3-D)/4  
(n-1)bn=(-2R1+3*R2+R3-D)/4  
最后貪心構造即可

G. Lamb's Respite

因為一開始是從滿血出發的,一旦血條沒了直接掛,這個過程可以看做是對序列求一個最小子段和,要求這個子段和加血量大於零。

然后注意到放技能期間只要小於 \(\lceil\frac{H}{10}\rceil\) 是直接鎖血的。實際上只需要判斷有無觸及這條線即可。這個和上面那個差不多。

所有操作可以用線段樹維護前綴/后綴/整體最小完成。復雜度 \(O(n\log n)\)

B. Cilantro

首先可以證明的是:只要 Y 與 N 個數一樣就一定有解。具體可以反證得到。

這樣我們可以發現,如果前 \(x\) 個元素入棧后仍然合法,那么 \(y<x\) 個元素入棧也一定合法。所以我們只需要求出最大的位置,然后該位置前所有與 \(t_1\) 相同的字符全部合法。

直接二分可以做到 \(O(n\log n)\)。然而這題卡常過不去。

考慮優化。可以想到的一個貪心是,如果一個元素留在棧底,干脆就讓它一直留在那里,直到最后一個匹配上的位置。

具體來說,我們對\(s\) 從前往后,嘗試將 \(t\) 從后往前匹配。但是注意匹配的前提要求有解,換句話說當前元素后面沒有被匹配的元素需要和 \(s\) 的后綴 Y/N 的數量一樣多。可以再維護一個指針,表示未被匹配部分 Y/N 的數量。

復雜度 \(O(n)\)

D. Flowerbed Redecoration

平移框子不是很好處理,考慮變成將整個矩陣反着循環位移即可。

題面里又是旋轉又是平移,然而這些其實不重要,重要的是這些都是置換

\(\cal{F}\) 為旋轉 \(\{[1,d],[1,d]\}\) 的置換,\(\cal{G}\) 為整體向左平移的置換,\(\cal{H}\) 為整體向右平移的置換。那么行操作的置換就是 \(\cal A=(\cal F\circ\cal G)^i\circ\cal F\)。整體的置換就是 \((\cal A\circ\cal H)^i\circ\cal A\)

直接快速冪即可。可以對每個置換環單獨處理做到 \(O(nm)\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM