Codeforces 泛做


CF506E
建出自動機后矩陣快速冪,將相同的路徑壓在一起,奇回文串特判

CF1188D
考慮最后所有數都變成了 $ x $,第 $ i $ 個數要被加的次數就是 popcount($ x - a_i $),將所有 $ a_i $ 變成 $ max{a} - a_i $,按位 dp,進位情況只有 $ n + 1 $ 種

CF1188E
如果一個串可以一直進行操作稱為好串,壞串的方案是好算的,枚舉一個操作次數即可,好串能變成的串 $ b $ 和原串 $ a $ 一定滿足所有 $ a_i - b_i $ 在 mod 串長意義下相同,可以通過把兩個串的極差都變的小於串長來證明,枚舉 $ a_i - b_i $ mod 串長的值,組合數計算

CF521D
把 assign 操作變成 add 操作,操作順序一定是 assign, add, multiply,直接貪心

CF521E
提取出原樹任意一顆生成樹,如果有一條邊被不在生成樹上的邊覆蓋至少兩次就可以構造

CF526G
將問題傳化成選至多 $ 2y $ 個葉子且 $ x $ 要在這些點的連通塊中,容易發現直徑端點至少會被選中一個,剩下可以選 $ 2y - 2 $ 個任意的點,再選一個點使得 $ x $ 在連通塊中,分類討論一下

CF843D
容易發現最短路增量小於等於選的邊的數量,因此值域很小,開值域個 queue 可以去掉堆的 log

CF923E
hy 說可以有理函數展開

link

CF1396E
考慮最大匹配顯然是以重心為根,所有點的 dep 之和,每個點都走到重心再匹配,令當前答案為最大匹配,每次找兩個點匹配使他們不走到重心,答案會減少兩個點 lca 的深度,簡單構造一下

CF1236F
仙人掌連通塊 = 點 - 邊 + 簡單環,暴力拆式子,算點的個數的平方的期望相當於求點對同時出現的概率,其余也可以用類似的方法計算

CF1396D
枚舉 x1 后從大到小枚舉 x2,用線段樹維護對於每個 y1 最小的合法 y2 的位置,容易發現 y2 的位置是單調的

CF538G
將坐標 $ (x, y) $ 變成 $ (x + y, x - y) $ 可以把兩維坐標獨立,在 mod l 意義下相鄰的兩個時間計算進行 $ l $ 次操作后的位移量的限制,注意上下取整

CF516E
首先可以轉換為 n 和 m 互質的情況,考慮兩個指針分別在 x 和 y 且兩個位置此時均為 1,經過 n 輪后會讓第二個指針前進 $ n \bmod m $ 步,經過 m 輪會讓第一個指針前進 $ m \bmod n $ 步,串成一個環后對每個 1 計算一下,特判很惡心

CF566C
用 $ ans_i $ 表示以 i 為根的答案,以帶權重心為根,每一條向下的路徑的 $ ans $ 都不遞減,任何一個點只有一個相鄰的點的 $ ans $ 會小於它,點分治求出導數最大的子樹判一判

CF566E
判掉菊花的情況,如果存在兩個點距離為 $ 3 $,他們集合的交大小一定為 $ 2 $,在這兩個點之間連一條邊,只有葉子沒被連邊,判掉連的邊的條數只有一條的情況,剩余就是找到葉子接在哪個點上,這個只要看某個集合和非葉子點的交就行了,關鍵是要高效判斷一個集合是不是葉子的集合,我們可以把這個集合的非葉子集合和葉子集合分開,如果存在一個集合只包含部分葉子集合內的點,或者包含所有葉子集合內的點不包含整個集合,這個集合就不是葉子的集合,用 bitset 實現

CF771E
用 $ f_{i, j} $ 表示第一行前 $ i $ 個可以選,第二行前 $ j $ 個可以選的時候的最大權值,容易發現狀態數只有 $ O(n) $ 個

CF1392H
容易發現抽到一張 joker 的期望次數是 $ \frac{n}{m+1} + 1 $,我們只要算出期望要抽幾張 joker 即可

考慮每次抽一張 joker 的過程,相當於把 $ n + m $ 張牌隨機排列,第一張 joker 和之前的牌都會被抽一次,一個集合 $ S $ 不被抽到的概率是 $ \frac{m}{|S| + m} $,相當於把這個集合和 $ m $ 張 joker 重排,第一張是 joker 的概率,考慮抽了 $ k $ 張還沒抽完的概率是

\[\sum_{i=1}^{n} \binom{n}{i} \left(-1\right)^{i-1} \left(\frac{i}{i+m}\right)^k \]

相當於枚舉一個集合大小 $ i $ 后容斥算貢獻,期望張數就是對每個 $ k $ 都計算一下后加起來

CF1012F
用 $ f_i $ 表示當前已經辦好了 $ i $ 這個集合的護照的最小時間,直接轉移(題解貌似是 $ 2^n \cdot n $ 的,寫了 $ 2^n \cdot n^2 $ 卡了半天常

CF983D
離散化掃描線,對線段樹每個區間維護一個 $ mx $ 表示當前區間內最大的還沒被算進答案里的中最晚出現的矩形,維護一個 $ lim $ 是當前這個區間在什么時候被已經算進答案里的矩形完全覆蓋,如果 $ mx < lim $ 則當前區間的矩形被完全覆蓋,要將 $ mx $ 賦值為 $ 0 $,update 的時候 $ mx $ 是兩個孩子的 max,$ lim $ 是兩個孩子的 min

CF512D
容易發現要進行計數的序列是拓撲序,把圖縮點后變成樹,樹上拓撲序計數是經典問題,如果一個連通塊是一棵樹就以每個點為根算一算,最后除一個根的方案數的貢獻,如果連通塊內有環就隨便選一個環縮成的點為根,最后卷起來

CF571D
如果只有 U 操作和 A 操作是好搞的,建出操作樹后 dfs 就行了,但是現在多了一個將集合內的數修改為 0 的操作,其實只要對每個詢問處理出上一次被修改為 0 的時間即可,建兩個操作樹

CF547E
建 ac 自動機后算某個串在 $ s_1, s_2 \cdots s_i $ 中的出現次數即可

CF917D
link
也可以把給定的樹的邊的邊權設為 x,其余的邊的邊權設為 1,求出來的行列式的 $ x^k $ 項就是選 k 條重復的邊的方案數,求點值后高斯消元可以做到 $ n^4 $

CF1270I
首先將下標從 $ [1, 2^k] $ 變為 $ [0, 2^k-1] $
定義矩陣乘法 $ A = B \times C $ 其中 $ A_{i, j} = \bigotimes_{x=0}{2k-1}\bigotimes_{y=0}{2k-1} B_{x, y} \cdot C{i-x, j-y} $
令 $ F_{i, j} $ 表示 $ (i, j) $ 這個格子在不在給定的 t 個格子中,在為 1 不在為 0,令 A 為最開始給你的矩陣,我們需要找到矩陣 G 使得 $ F \times G = A $ 且 G 中非零位置盡可能少
經過一些推導可以得到 $ F{2k} $ 為單位元,因此 $ G = A \times F^{-1}, F^{-1} = F{2k-1} $, 我們還可以發現 $ F{2x} $ 中只有 $ t $ 個位置有值,因此可以將單次矩陣乘法優化到 $ t \times 2^{2k} $,要進行 $ k $ 次矩乘,可以通過此題

CF1320E
虛樹上跑 dij

CF1078E
link

CF1078D
處理出以 i 開始經過 $ 2^k $ 步能走到的區間,開 log 個 st 表即可

CF587E
建出 ac 自動機,對串長根號分治

CF639F-鴿
虛樹上跑 tarjan

CF913H
被 Sooke 教導了一番才會
維護分段函數,最多有 $ n^2 $ 段,用面積表示概率
對分段函數再次進行積分貌似可以做到 $ O(n^4) $ 的復雜度

CF704E
首先樹剖轉成序列上的問題,如果答案比 t 大,在 t 時刻之前點的位置的相對順序一定不會發生改變,維護相鄰的點算一算就行了

CF913G
假設 a 有 n 位,枚舉 a 前面有幾個數 m,有式子 $ x = a * 10^m + b (mod\ 10^{n+m}), 2^{n+m}\mid x,5\nmid x $,容易發現當 $ 2^{n+m+1} \le 10^m $ 的時候一定可以找到合法的 b,因為 2 是 $ 5^p $ 的原根,構造一下就行了

CF1336F
討論鏈並的兩個端點是否是祖孫關系,用線段樹合並在 dfs 序較大處計數

CF605E
倒着 dij

CF613E
容易發現答案一定是一個 $ \subset $ 形和一個 $ \supset $ 形拼起來,中間填一條從左到右的鏈,可以 dp 出答案,然后把第二個串反過來再做一遍,很多很多的特判,如果第二個串的串長很小我們可以爆搜減少討論

CF611H
串長最大為 6,先把相同串長的連邊連上,每個串長選一個"關鍵點",容易發現可以構造不存在兩個非關鍵點相連的方案,枚舉生成樹后跑網絡流

CF1307G
給每條邊添加一個流量 1,跑費用流,每次增廣跑出來的東西是一個最小割,如果要使最短路增加 x 可以把最小割中每條邊都加 x,存起來查詢時二分

CF611G-鴿
凸包面積就是選個基准向量,剩下的相鄰向量叉一叉,按順序枚舉基准向量,容易發現使得分割面積小於等於一半的向量的單調的,隨便維護下

CF1416E
平衡樹優化 dp,貌似可以直接用 set 搞,手寫 fhq 卡了半天才過去

CF1276F
只要考慮怎么高效求 * 左右都有字符的方案數,枚舉 * 左邊的串,容易發現 endpos 集合相同的左邊的串對應的方案數也是相同的,假設當前左邊串的 endpos 集合是 {1, 3, 5},右邊的串就可以從 {3, 5, 7} 開頭從串中選,容易發現是反串的 parent 樹上的鏈並,set 啟發式合並維護

CF883D
二分答案,我們可以給每個 P 定一個方向,從左往右掃,如果最后一個 P 是右的,我們只需要貪心的選一個沒被吃掉的 * 最靠右的情況,如果最后一個 P 是往左的,之后的 P 再向左是不會對當前局面造成影響的,因此只需要貪心的選一個最后一個向右指的 P 的位置最靠右的情況,直接 dp

CF603E-鴿
容易發現答案肯定是不增的,我們連完邊后只能存在偶數大小的連通塊,否則總度數之和是奇數,如果連通塊是一顆樹,把所有兩端點的子樹大小為奇數的邊選在邊集內是唯一的方案,容易發現最優方案一定會存在於最小生成樹中,用 lct 維護最小生成樹,由於答案不增,從大到小枚舉當前的邊看看子樹兩邊是不是都是偶數,如果是就刪掉,可以用 lct 維護子樹大小來搞,復雜度是單 log 的

CF1083F
轉換為使差分數組全變成 0,把 % k 相同的位置提出來,容易發現要求前綴異或和為 0 的個數,分塊維護

CF1163F
隨便找一條最短路,對不在最短路樹上的邊算一下兩個端點沿着最短路樹跑到的節點,刪掉兩個節點中間的邊的權值可以對經過這條邊的答案取 max,就可以求刪掉一條邊后的最短路長度了

CF671D
轉換為對偶問題后用可並堆貪心

CF1205F
簡單分析一下析合樹的性質,我們可以發現連續段個數就是析合樹節點個數加上合點所產生的額外連續段個數,合點的兒子數量不能為 $ 1 $,析點的兒子數量要大於等於 $ 4 $,容易發現滿足這個性質的析合樹都可以構造出對應的排列,dp 一下即可

CF1427G
填的每個數都是輸入的某個數,我們可以用一個 $ \texttt{01} $ 串來表示一個數,第 $ i $ 位為 $ 1 $ 表示這個數大於等於輸入的第 $ i $ 小的數,容易發現這個 $ \texttt{01} $ 串一定只有一段前綴是 $ 1 $,剩下的都是 $ 0 $。我們假設我們填進去的數不用滿足這個條件,考慮第 $ i $ 位造成的貢獻,就是相鄰的兩個數這一位不同的對數,容易發現這是最小割。從第 $ 1 $ 位往上推,每次退流后重新跑網絡流,復雜度是四次方的,可以感性證明不會出現一個數填的時候不會出現 $ 010 $ 的情況(嚴謹證明應該也不難,但是懶得證了)。


免責聲明!

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



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