近期題解(2024.7.26)

KingPowers發表於2024-07-26

CF1070A Find a Number

一個樸素的想法是設 \(dp_{x,y}\) 表示模 \(d\)\(x\) 且和為 \(y\) 的最小值,那麼答案就是 \(dp_{0,s}\)

自然初始狀態為 \(dp_{0,0}=0\),但是我們發現這個轉移關係是帶環的,所以說要把這個 dp 換成最短路。

直接從 \((0,0)\) 為源跑一遍 bfs 即可,時間複雜度 \(O(sd)\)

提交記錄

CF1840G1 In Search of Truth (Easy Version)

猜環長這種東西,有個經典的類似 BSGS 的猜法。

考慮設定一個步長 \(B\),先一步一步地跳,把環的前 \(B\) 個位置給跳上,並標記好是在第幾步被跳到的。

隨後按照我們設定的步長 \(B\) 步一次地跳,因為餘數小於除數,所以這麼跳完一圈之後一定會落在前 \(B\) 個位置上,又因為我們知道前 \(B\) 個位置是環上的第幾個點,所以我們可以直接算出環長。

\(B=\sqrt n\) 可以得到 \(2\sqrt n\) 左右的上界詢問次數,可以透過 Easy Version。

提交記錄

CF731E Funny Game

因為二人都選最優的決策,所以說我們的決策是跟未來有關的,考慮倒著 dp,設 \(dp_i\) 表示 \([i,n]\) 這個字尾內的最大得分。

\(s_i\) 表示字首和陣列,容易發現考慮 \([i,n]\) 這個字尾時 \(s_{i-1}\) 的貢獻是一定要被算上的,所以我們就有轉移 \(dp_i=\max_{j>i}\{-dp_j+sum_{j-1}\}\),顯然維護個字尾 \(\max\) 就能快速轉移,時間複雜度 \(O(n)\)

提交記錄

CF1826E Walk the Runway

視每個物品擁有 \(m\) 個屬性的話,那麼選擇兩個物品的限制其實是一種 \(m\) 維偏序。顯然地,如果 \(a,b\) 能同時選且 \(b,c\) 能同時選,那麼 \(a,b,c\) 也是能一塊選走的。

所以如果我們能夠處理出任意兩個物品之間能否都選,那麼我們按照任意一維排序後從前往後 dp 就能統計出答案了(因為要滿足限制任意一維一定是遞增的),所以就去思考怎麼處理這個東西。

多維偏序本身就有經典的 bitset 解法,這裡我們也可以試下。先把 \(m\) 維全都分開考慮,把所有物品按照當前考慮的這一維屬性排序,然後每個物品在單獨這一維下能選的物品就是它前面的物品,那我們直接把 \(m\) 維可選的物品取個並即可,可以使用 bitset 維護。

細節:排序後要對每個相同的段考慮。

時間複雜度 \(O(nm\log n+\frac{n^2m}{w}+n^2)\),分別是排序、bitset 和 dp 的複雜度。

提交記錄

CF1638E Colorful Operations

這不是板子題/xk。

考慮顏色段均攤,先上一個 set 用來維護連續段,思考如何維護加法操作。

不妨採用標記的方式,令 \(tag_x\) 表示顏色 \(x\) 應該額外加上的值,對於 Add 操作直接在 \(tag\) 陣列上修改。對於區間覆蓋操作時,假設有一段區間 \([l,r]\) 要從顏色 \(x\) 覆蓋成 \(y\),那直接為 \([l,r]\) 這段區間加上 \(tag_x-tag_y\),減去 \(tag_y\) 是因為之前給顏色 \(y\) 的加法這段區間不應該算上。輸出時直接加上對應位置的 \(tag\) 即可。

上面的操作只需要一個樹狀陣列來維護,根據經典結論總時間複雜度為 \(O(q\log n)\)

簡要說下正確性:容易發現每一次區間染色操作至多會使整個序列的連續段個數加 \(1\),同時我們可能會刪除一些連續段,但是每個連續段至多隻會被刪除一次,每次加入/刪除連續段的複雜度是 set 的 \(\log\),所以總複雜度為 \(O(q\log n)\)

提交記錄

CF1697E Coloring

考慮對於每個點求出來到其它點的最短距離,然後再向達到最短距離的點連一條單向邊。

我們取出所有的極大的雙向聯通子圖,如果這個子圖是完全圖那麼其所有點要麼同色要麼互不相同,否則全都互不相同。

對於可以染成同色的點集我們稱之為同色點集,那我們先對所有同色點集做一個揹包,設 \(dp_i\) 表示使用 \(i\) 種顏色的方案數,每個同色點集可以貢獻的顏色數為 \(1\) 或點集大小。

答案即為 \(\sum_{i=1}^n\binom{n}{i}i!dp_i\),也就是選出來 \(i\) 種顏色再考慮染色順序。

時間複雜度 \(O(n^2)\)

提交記錄

相關文章