洛谷P6158 封鎖
給出一個的網格圖,每條邊有兩個邊權。求一個左上角到右下角的割使得最小。
跟最小乘積生成樹的做法類似,把每種方案看成二維平面上的一個點,其中分別爲兩個邊權,那麼答案一定在下凸殼上。先分別找到橫座標最小和縱座標最小的點,然後通過設置邊權來找到在它們下方且離它們最遠的點,然後遞歸下去。
Codeforces 1305F Kuroni and the Punishment
給出個數,每次可以將某個數加或減,並花費的代價,且需要保證操作後仍然是正數。問最少花費多少代價,使得這個數的大於。
。
注意到答案的上界是。因此最優情況下,操作次數不大於次的數至少有個。故只需要每次隨機選一個數,並暴力把分解質因數,然後計算並取最優值即可。
Codeforces 1322B Present
給出,求這個數的異或和。
對每一位分別計算貢獻。假設當前是第位,則把個數在模意義下排序,可以發現在每個數前面,且加上這個數能夠進位到的一定是連續的一段,並且左端點單調不增。於是只要對是的兩種情況分別討論即可。
時間複雜度
Codeforces 1322C Instant Noodles
給一個個點的二分圖,右邊的點有點權。設爲左邊的點的子集,爲屬於右邊且至少與中一個點有邊相連的點的集合,表示的點權和。對於所有可能的,求的。
考慮兩個交集爲空的集合,對答案的限制是。可以理解成把右邊的點集的劃分作了限制。發現只有與左邊的點的連邊情況相同的點能夠分爲一組。於是先對連邊情況排序,然後把相同的分爲一組,並對每組的權值和求個就是答案了。
時間複雜度。
【Atcoder】【Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020】【E - Odd Sum Rectangles】
構造一個的矩陣,使得和爲奇數的子矩陣數量最多。
不妨假設。固定子矩陣的左右邊界,令,那麼左右邊界爲的子矩陣的貢獻爲中的個數乘的個數。不難發現答案的上界爲。下面構造一個滿足該上界的答案。
假設,且已經構造出大小爲的合法方案。對於的情況,我們把矩陣的四個角落填上的方案,然後讓的值爲,第行和第列的值爲。不難驗證這樣的構造是滿足條件的。
Codeforces 1325E Ehab’s REAL Number Theory Problem
給出個數,滿足有不超過個因子。問最少選出多少個數,使得這些數的乘積是完全平方數。
把的平方因子除掉後,就只剩下一個或兩個指數爲的素因子。若是素數,則在與之間連邊,否則在的兩個素因子之間連邊,答案就是圖中的最小環。
求最小環可以從每個點出發bfs,把bfs樹建出來後在所有非樹邊組成的環中挑一個最小的。
這樣做是的。但容易發現每個環中都至少包含一個不大於的素數,於是只需要枚舉不超過的點爲起點bfs即可。
Codeforces 1325F Ehab’s Last Theorem
給出個點條邊的連通無向圖,設,求一個有個點的獨立集,或是至少有個點的簡單環。
有兩種做法:
第一種是把dfs樹建出來,對於從下到上的每個點,若該點有小於條返祖邊,則把該點加入獨立集,並把返祖邊連向的祖先刪掉。否則只要在其中找到深度最小的祖先,則這兩點之間構成一個滿足條件的環。
第二種是每次找度數最小的點,若該點度數小於,則將其加入獨立集,並把與它有邊相連的點刪掉。若某個時刻所有點的度數都至少爲,則容易構造出一個大小至少爲的環。
AtCoder Grand Contest 043 C - Giant Graph
有三個個點的簡單無向圖,構造一個有個點的無向圖,每個節點表示爲,其中表示在中的點。兩個點之間有連邊當且僅當其中兩位相等,且另一維在原圖中對應的點有連邊。定義一個點的權值爲,求新圖的最大權獨立集。
貪心地想,肯定是每次找一個權值最大的點,然後把這個點相鄰的點刪掉。設表示這個點是否被選,轉移顯然。
再考慮這樣一個遊戲:在每個圖的某個節點上有一顆石子,每次可以將某個圖中的石子移到相鄰且標號比當前節點大的點上,不能操作者輸。設表示當前狀態爲時選手是否會輸。
不難發現兩個dp數組的值相等。並且第二個dp數組的值刻意通過求出每個圖的sg函數值來得到。那麼只要分別求出每個圖的sg函數值,並求出所有異或值爲方案的權值和即可。
AtCoder Grand Contest 043 D - Merge Triplets
問有多少個到的排列可以被如下方式構造得到:有個長度爲的序列,每次移除所有序列的第一個數中最小的那個並將其加入到排列末端,重複此過程次。
若有某一個數,它所在的序列中有一個比它大的數在它前面,那麼選了之後就會立刻選。這樣就可以把某個數和它後面的比它小的數合併成一塊。那麼最終的排列就是將每一塊按第一個數從小到大排序,然後首尾相接。這樣一個排列就跟一種分塊方案一一對應。
而一種分塊方案是合法的,當且僅當每個塊的大小不超過,且大小爲的塊不少於大小爲的塊。假定分爲塊,大小分別爲,則能構造出的排列數爲
這是因爲最後一塊的第一個數必須是,然後後面的個數可以任意選,不斷遞歸下去就得到了上述式子。
那麼就可以設表示選了若干組的大小之和爲,大小爲的塊數量減去大小爲的塊數量等於的貢獻和。複雜度。
洛谷U107962 魔法
給出長度爲的序列,定義。有次詢問,每次給出,詢問的值。
可以發現
設塊的大小爲,。若令,則
考慮如何求。發現在固定時,可以通過把數組翻轉後與進行卷積來求對應的,那麼就可以NTT預處理了。
時間複雜度。
Codeforces 1334G Substring Search
給一個長度爲的排列和由小寫字母組成的串和,求的每一個長度爲的子串是否與匹配。設爲的子串,則與匹配當且僅當或者對成立。這裏定義,如此類推。
設排列的某一個環上的元素依次爲,則令中對應字符爲的位置爲輻角爲模長爲的複數,中對應字符爲的位置爲輻角爲模長爲的複數。這樣若和兩個位置的字符可以匹配上,則它們對應複數的乘積爲輻角等於或的複數,滿足實部等於,否則實部的值就會與有較大差距。因此我們只要把和對應的數字串卷積起來,就可以得到的每個子串的數字串和的數字串對應位相乘再相加的結果,再判斷與目標結果是否相等即可。
但不同環上的字符也可能被誤認爲匹配,這時需要先用kmp判一遍是否對應字符都在同一個環上即可。
Codeforces 1340F Nastya and CBS
有一個長度爲的括號序列,其中包含種不同的括號。每次修改一個位置的括號,或判斷一段區間是否是一個合法括號序。
定義如果一段區間是合法的,如果它在消去匹配的括號後變成一段右括號+一段左括號的形式。用線段樹維護每一段合法區間的右括號序列和左括號序列的哈希值。合併的時候,討論左區間的右括號序列和右區間的左括號序列的相對大小,然後再遞歸求出較長那一段的前綴或後綴哈希值。
時間複雜度。
Codeforces 1342F Make It Ascending
給一個數組,每次操作可以選擇兩個數,令,並把刪掉。問最少需要多少次操作把數組變爲單調遞增。
可以看成新數組中的一個數是由原來數組中的若干個數拼在一起形成的。設表示用中的數,拼成了長度爲的遞增數組,其中第個數的位置在原數組的的位置上,第個數最小是多少。轉移的時候枚舉子集,然後對新的數貪心選擇儘量靠左的位置放置。
時間複雜度。
Codeforces 1348F Phoenix and Memory
有個人和個位置,每個人可以匹配的位置是一段區間,保證存在完美匹配,問完美匹配是否唯一。
先用貪心求出一個完美匹配:按編號從小到大確定每個位置匹配的區間,每次選取包含當前位置且還沒被選擇的區間中右端點編號最小的即可。
把人和位置看成有向二分圖,把匹配上的人和位置縮成一個點,則完美匹配唯一當且僅當縮點後的圖是一個DAG。用線段樹優化拓撲排序即可。
Codeforces 1349D Slime and Biscuits
有個人,第個人有塊餅乾。每次從所有餅乾中隨機選擇一塊,並隨機交給除了該餅乾的主人以外的個人中的其中一個。問所有餅乾都位於同一個人手裏所需的期望時間。
設表示結束時所有餅乾均位於第個人手裏的期望時間乘上對應概率的值,表示結束時所有餅乾在第個人手裏的概率,表示從初始狀態到所有餅乾位於第個人手中的期望時間,表示從全部餅乾位於某個人手裏的狀態到全部位於另一個人手裏的狀態的期望時間。則有
且不難得到關係式
把對應關係式的等號兩側求和,得到
令表示從某個人手裏有塊餅乾的狀態,到這個人手裏有塊餅乾的狀態的期望時間。遞推出後就可以求出和。
Atcoder NOMURA Programming Competition 2020 D - Urban Planning
有個點的無向圖。每個點可以選擇除了它以外的一個點,表明這兩個點必須屬於同一個連通塊。現在有一些點的選擇已經固定,問其他點任意選擇的所有情況下,圖中最少存在的邊數之和。
如果把邊看成有向邊,那麼原圖已有的邊組成的弱連通塊,要麼是生成樹,要麼是生成樹加一個環,最終的圖的每個連通塊必然都是一個環套樹。可以轉化爲求每種方案中環的數量之和。圖中固定的環可以直接計數。若由大小爲的生成樹連通塊組成一個環,容易得出方案數爲,因此求出表示前個連通塊中,選出個構成一個環的方案數之和即可。
時間複雜度。