2021年藍橋杯第十屆軟件類省賽 c++A組 第一場(口胡題解) 未完成


好吧雖然上次的還沒完成但我又來口胡了_(:з」∠)_

不知道有沒有簡單公式,但直接暴力模擬應該也沒有什么問題吧

一共四百多個點而已,可以直接暴力找到所有可能直線然后去重。去重我感覺搞個結構體sort一下然后掃一遍就好了

乍一看以為是個DP
仔細一想題意應該是給定\(n\),找 滿足\(abc=n\)的點對\((a, b, c)\)的個數。
也就相當於找到\(n\)的所有質因數,分成\(3\)堆,每堆不同,求方案數。
\(n\)的質因數個數最多就\(logn\)個,所以這里直接暴力找找就好
統計的話目前是兩種想法:
1,直接對於所有質因數統計,再對相同質因數去重

\[ans = \frac{\binom{[\sum t(i)] - 1}{2}}{\prod{t(i)!}} \]

\(t(i)\)表示第\(i\)種質因數的個數

2,對不同質因數分開統計

\[ans = \prod{\binom{t(i) - 1}{2}} \]

具體統計時用的都是插板法


看起來暴力建邊暴力跑也沒什么問題的樣子


看起來可以狀壓搞搞的樣子



看上去直接DP就好,\(f[i]\)表示重量\(i\)是否可以被表示,注意由於砝碼可以放兩邊,所以砝碼權值可正可負,轉移的時候注意一下,應該可行?




看上去是博弈論,我對博弈論一無所知……




注意到一棵樹內部對子樹怎么重新組合,其實不會影響它父親和兄弟。
它的兄弟會在父親的支配下被放入這棵樹的右側。
所以我們可以嘗試樹形DP
\(f[i]\)表示以\(i\)為根的子樹重新組合后的最大高度。那么考慮一個貪心的做法。
\(f[i]\)從小到大排序,把高的子樹接在矮的子樹下面。
為什么這樣一定最優?
如果一個子樹比它兄弟高,而你把它兄弟接在它右兒子的位置,那這個子樹的高度不會被擴展,因為它兄弟這個分支的最大深度就是它兄弟原本深度 + 1,是小於等於這個子樹深度的。
所以我們要盡量保證子樹比它兄弟低,才把它兄弟放在右兒子的位置。
這樣復雜度大概是\(O(n + \sum{m(i)logm(i)})\), \(m(i)\)為節點\(i\)的子節點個數,所以復雜度約為\(O(n + nlogn)\)


分別考慮左右括號補全。
對於一個未匹配的左括號,我們在它右側補右括號使其合法,由於我們補全的右括號一定是和這個左括號匹配的右括號,所以不會影響其他未匹配右括號的匹配情況
右括號同理。
因為補全左右括號過程相對獨立不沖突,所以我們先考慮將序列中所有左括號變合法,再考慮使所有右括號變合法
我們先來考慮本質不同這個點。
本質相同的補全造成的重復無非就是幾個右括號排在一起可以交換順序之類的。
所以我們考慮只在左括號右側插右括號,可以插入多個右括號
從左向右DP, 令f[i][j]表示DP到i位, 已經補全了j個括號

\[f[i][j] = \sum_{0 <= k <= min(lim[i - 1], j)} f[i - 1][k] \]

i這一維可以滾掉,因為第二維是大的數用到小的數,所以從后向前枚舉。
考慮到新f[j]要求的其實是個前綴和,所以可以每次統計一下前綴和,優化一下,這樣就是\(O(n^2)\)的。
然后對於右括號也是類似的做法,最后兩次DP的答案相乘就是最終答案。
純屬口胡,沒驗證正確性_(:з」∠)_



免責聲明!

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



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