A 17:35 +0
B 39:51 +0
C 80:28 +4
A.Limited Insertion
簡要題面:
最初有一個空序列,每次操作選定一個 \(i\) 並把 \(i\) 插入到位置 \(i\) ,給定最終序列,構造一種合法方案或者輸出 -1 。
\(n \leq 100\)
做法:
簡單思考發現每次操作出來的數一定從後往前對應了最終序列中的相同數。
這提示我們在操作的過程中我們可以實時知道當前序列中的數對應在最終序列的位置。
每次操作從後往前列舉操作決策即可。
時間複雜度 \(O(n^2)\)
B.Balanced Neighbors
簡要題面:
給定一個整數 \(n\) ,構造一個 \(n\) 個點的簡單無向聯通圖,使得每個點的鄰點的點編號和相等。
$ 3\leq n \leq 100$
做法:
樣例裡給了 \(n=3\) 的構造,嘗試手造 \(n=4\) 。
手造+打表 \(n \leq 7\) 的情況,發現都有一個合法圖滿足鄰點編號和為 \(\frac{n(n+1)}{2} - n - [n\mod 2=0]\) 。
所以直接考慮對這個東西構造,容易發現斷掉每個點的一條出邊即可。
時間複雜度 \(n^2\) 。
C.Three Circuits
簡要題面:
給定一個 \(n\) 個點 \(m\) 條邊的簡單無向聯通圖,判斷這個圖的所有邊是否可以劃分為三個不交的非空集合,使得每個集合內的邊構成一個可以重複經過點的環。
\(n,m \leq 10^5\)
做法:
首先原圖所有點的度數必須均為偶數。
接下來只需要考慮能否拉出來三個環。
這裡提供兩個解法,一個是 VP 時的奶龍解法,一個是更好的解法。
奶龍解法
直接跑 dfs ,每次拉出來一個不經過重複點的環,跑兩遍以後看還有沒有多餘的邊。
充分性易證,必要性完全沒有。
容易發現以下圖片中的圖便是一個必要性的反例。
解決這個問題也比較容易,直接隨機選出邊跑 10 次就行了!
時間複雜度 \(O(Tn \log n)\) ,\(T\) 為跑的次數,log 是因為刪邊比較麻煩所以用 set 維護導致的。
更好的解法
首先圖內如果有一個節點度數大於等於 6 ,從這個點拉出來三個環就行了。
所以還不合法的圖所有點的度數不超過 4 。
顯然有至少三個度數為 4 的節點合法。
恰好兩個的情況比較特殊,需要判是否拉出一個環出來會使得圖不聯通。
時間複雜度 \(O(n)\) 。
D.Rotation Sort
簡要題面:
給定一個長度為 \(n\) 的排列 \(p\) 和兩個整數 \(a,b\) ,每次操作可以消耗 \(a\) 的代價把某個數向後插入到任意位置或者消耗 \(b\) 的代價把某個數向前插入到任意位置,問把整個序列變為升序的最小代價。
\(n \leq 5000, 1\leq a,b \leq 10^9\)
解法:
容易發現每個數只會被操作一次,同時決策了每個數被操作的方向以後我們就不關心這個數原本的位置了,只需要保證每個數可以被操作到合法位置即可。
設計 dp ,令 \(f_{i,j}\) 表示前 \(i\) 個數中最後一個沒有被操作的數為 \(j\) 的可以使這個字首合法的最小代價。
轉移是簡單的,如果固定的數較小就往後移或者不動,否則就必須往前移。
時間複雜度 \(O(n^2)\)
E.Modulo Pairing
簡要題面:
給定 \(n,m\) 與一個長度為 \(2n\) 的整數序列 \(a\) ,決策一種匹配,使得每個數正好與另一個數匹配,同時每對匹配的數的和 \(\mod m\) 的最大值最小。
\(n \leq 10^5, 1\leq m\leq 10^9, 0\leq a_i < m\)
做法:
非常厲害調整。
參考了 粉兔的題解 。
先把 \(a\) 排序。
如果把和小於 \(m\) 的匹配連藍邊,大於等於 \(m\) 的匹配連紅邊,最終的答案一定形如某個字首中都是藍邊的匹配,且最大和最小依次匹配,字尾中都是紅邊且最大和最小依次匹配。
證明和匹配的形式粉兔的題解中有很清晰的圖片。
知道了這個結論之後就可以二分邊界點了,因為靠左的分界點答案更小,合法的分界點一定是一個字尾。
這意味著我們可以二分,時間複雜度 \(O(n\log n)\)
F.One Third
非常恐怖推式子,回家補。