2024.3 記錄

KingPowers發表於2024-03-10

3.5

vp 了一場 edu,過了四題,但是 D 題有 *2100,自我感覺還行。

這裡寫一下後三題的題解。

CF1913D Array Collapse

數字互不相同,先上個單調棧求出每個點的支配區間。

考慮 dp,\(f_i\) 表示只考慮 \([1,i]\) 時的方案數,找到最靠左的 \(j\) 滿足 \([j,i]\) 間不存在小於 \(p_i\) 的數,那麼 \([j,i-1]\) 這些位置的 dp 值都能轉移到 \(f_i\)

除此之外,以 \(j-1\) 結尾的最長上升子序列也都能轉移到 \(f_i\),因為這些位置與 \(i\) 之間的數一定可以被刪去。

隨便最佳化下轉移就能做到 \(O(n)\)

提交記錄

CF1913E Matrix Problem

考慮一個顯然但錯誤的建模方式:每行每列建一個點,\(S\) 向每行連容量 \(a_i\) 費用 \(0\) 的邊,每列向 \(T\) 連容量 \(b_i\) 費用 \(0\) 的邊,\(i\) 行向 \(j\) 列連容量 \(1\) 費用為矩陣 \(i\)\(j\) 列的數取反的邊。

至於為什麼錯誤,因為我們矩陣中原來的 \(1\) 對應了一條費用為 \(0\) 的邊,為了使費用最小我們肯定會優先流 \(1\) 而不流 \(0\),如果某行某列有多於限制數量的 \(1\) 也不會改回 \(0\),也就是說求出來的相當於是“至少”而不是“恰好”的答案。

考慮先將矩陣全都變成 \(0\),然後原來費用為 \(0\) 的邊改成 \(-1\)(相當於把對 \(1\) 的取反撤銷),這樣就流對了。

提交記錄

CF1913F Palindromic Problem

考慮求出 \(f_{i,c}\) 表示將 \(s_i\) 的字元改成 \(c\) 之後迴文子串數量的變化量,有了這個輸出答案就是一些無聊的分討。

先考慮什麼時候改字元會增加,假設有一個迴文中心 \(i\) 和迴文半徑 \(r\)(這裡是子串長為奇數的情況,偶數是類似的),那麼只有使 \(s_{i-r}\)\(s_{i+r}\) 字元相同時才會有新的貢獻,注意貢獻不止是 \(1\),應該再加上字尾 \([i+r+1,n]\) 與翻轉後的字首 \([1,i-r-1]\)\(lcp\)

然後再考慮什麼時候會減少,顯然更改一個字元會使所有原先經過它且不以它為中心的迴文子串消失,只需要求出每個位置被多少迴文子串經過即可,這個列舉迴文中心後貢獻是一個等差數列的形式,可以二階差分維護。

然後就做完了,這裡求 \(lcp\) 用的是字尾陣列,時間複雜度 \(O(n\log n+n|\Sigma|)\)

提交記錄

晚上學了下 Hall 定理。

CF338E Optimize!

\(b\) 的順序顯然不影響匹配,由於有不等式的限制不難想到先將 \(b\) 排序。

單獨看 \(a\) 的一段長度為 \(m\) 的子區間,設 \(f(i)\) 表示 \(b_i\) 能匹配的集合,根據 Hall 定理,存在完美匹配需要滿足對於任意的 \(k\le m\),任取 \(1\le i_1<i_2<\ldots<i_k\le m\),都有 \(|f(i_1)\cup f(i_2)\cup \ldots\cup f(i_k)|\ge k\)

因為 \(b\) 排序過,所以任意的 \(i<j\) 均有 \(f(i)\subseteq f(j)\),顯然上式成立等價於 \(|f(k)|\ge k\)

線段樹維護 \(|f(i)|\),初始令第 \(i\) 個位置為 \(-i\),每加入一個 \(a_i\) 相當於做一個區間加,滿足條件相當於全域性最小值非負,這都是好維護的。

時間複雜度 \(O(n\log n)\)

提交記錄

3.6

CF1930F Maximize the Difference

見我的洛谷專欄

ABC235G Gardens

直接容斥,列舉至多 \(k\) 個盒子有球。

\[\sum_{k=0}^n(-1)^{n-k}\binom{n}{k}(\sum_{i=0}^A\binom{k}{i})(\sum_{i=0}^B\binom{k}{i})(\sum_{i=0}^C\binom{k}{i}) \]

內層的組合數求和是典中典,可以直接地推,然後就 \(O(n)\) 做完了。

提交記錄

CF1863F Divide, XOR, and Conquer

牛逼的思路。

看見 \(n\le 10^4\),我們直接一反常規,考慮區間 dp:記 \(dp_{l,r}\) 表示區間 \([l,r]\) 是否能被保留。

然後有個顯然的 \(O(n^3)\) 做法,這裡不多贅述。

\(sum_{l,r}\) 表示區間 \([l,r]\) 的異或值,\([l,r]\) 能被保留當且僅當存在一個更大的可保留區間 \([L,R]\)(需要滿足 \(L=l\)\(R=r\)),滿足 \(sum_{l,r}\oplus sum_{L,R}\le sum_{l,r}\),這步根據題面顯然成立。

一個小性質:\(x\oplus y\le x\) 當且僅當 \(x\)\(y\) 的最高位上是 \(1\)

\(L_i\) 表示所有被保留的左端點為 \(i\) 的區間,它們的異或和的 \(\rm higbit\) 取值集合(用個 long long 存),同理定義 \(R_i\) 為所有被保留的右端點為 \(i\) 的區間,\([l,r]\) 能被保留就相當於是 \(sum_{l,r}\)\(L_i\)\(R_i\) 按位與的結果不為 \(0\)

於是做到了 \(O(1)\) 轉移,時間複雜度 \(O(n^2)\)

當然上面的討論都是基於區間異或和大於 \(0\),等於 \(0\) 和誰拼一塊都行,注意特判。

提交記錄

3.7

CF1930E 2..3...4.... Wonderful! Wonderful!

注意到刪除的數字數量 \(x\) 一定為 \(2k\) 的倍數,因此列舉 \(k,x\) 是調和級數的複雜度。

記保留為 \(0\),刪除為 \(1\),相當於是對一個 \(01\) 序列計數。

一個結論是,合法當且僅當至少存在一個 \(0\) 兩邊 \(1\) 的個數都至少為 \(k\),歸納易證。

還是不太好數,考慮容斥,用總數 \(\binom{n}{x}\) 減去不存在合法 \(0\) 的情況。

初始一個長為 \(x\) 的全 \(1\) 串,插入 \(n-x\)\(0\),那麼這些 \(0\) 只能插在兩邊 \(k-1\)\(1\) 旁,否則一定就有合法的 \(0\),一共有 \(2k\) 個合法的位置,直接隔板即可。

時間複雜度 \(O(n\log n)\)

提交記錄

P5590 賽車遊戲

這麼你哦。

邊權不好定,考慮限制整個路徑長度。

\(dis_i\) 表示 \(1\)\(i\) 的最短路,發現只要每條邊 \((u,v)\) 都滿足 \(1\le dis_v-dis_u\le 9\) 就能構造出合法答案,否則一定存在一條長不相同的路徑(注意當邊不在任何一條 \(1\)\(n\) 的路徑上時不應被考慮)。

然後對這個限制跑差分約束即可,時間複雜度 \(O(nm)\)

提交記錄

ABC232G Modulo Shortest Path

見我的洛谷專欄

P3530 [POI2012] FES-Festival

先建立差分約束圖,判斷是否有解。

對差分約束圖按強連通分量縮點,由於不同 SCC 之間的距離可以無限拉大,不同 SCC 之間答案獨立。

對於每個 SCC,找到其內部的點對 \(u,v\) 滿足 \(dis_{u,v}\) 最大(\(dis_{i,j}\) 表示 \(i\)\(j\) 的最短路),那麼這個 SCC 答案就是 \(dis_{u,v}+1\),將所有 SCC 答案加起來即可。

比較感性的理解就是因為邊權只有 \(1,0,-1\) 三種,\(dis_{u,v}\) 之間的數一定能取遍。

時間複雜度 \(O(n^3)\),因為要跑 Floyd。

提交記錄

3.8

CF960H Santa's Gift

見我的洛谷專欄

3.9

CF1879F Last Man Standing

顯然,\(x>\max a_i\) 是無意義的,且第 \(i\) 位玩家堅持的回合數一定為 \(h_i\lceil\frac{a_i}{x}\rceil\)

考慮列舉 \(x\),對於每個 \(x\) 我們只需要求出來堅持回合數最大和次大的玩家即可。

再用一個調和級數的複雜度固定 \(\lceil\frac{a_i}{x}\rceil\),那麼此時 \(a_i\) 取值範圍就是一個區間,在一定的值域範圍內回合數就只和 \(h_i\) 相關了,只需要維護出 \(h_i\) 的最大值和次大值即可。

這題卡常,必須嚴格 \(O(n\log n)\),考慮 ST 表維護 \(h_i\) 的最大值和次大值即可。

注意 ST 表要維護下標,因為直接合並最大值和次大值是錯的。

提交記錄

3.10

CF1902F Trees and XOR Queries Again

有一個經典的做法,考慮線性基的合併是可重的,將詢問 \((x,y)\) 拆成 \(x\)\(lca\)\(lca\)\(y\) 兩段,每段像 ST 表那樣倍增拆成兩個可重區間合併即可,由於線性基合併是 \(O(\log^2 V)\) 的,這個做法是三個 \(\log\),能不能過不好說。

更優的做法是考慮點分治,維護出連通塊內每個點到分治中心上的線性基即可,每次回答跨過當前分治中心且完全位於當前連通塊內的詢問即可,複雜度 \(O(n\log n\log V)\)

提交記錄

CF1059E Split the Tree

見我的洛谷專欄