Spark Special_楊寧遠 雜題分析.md

haozexu發表於2024-07-07

Spark Special 圖論_楊寧遠 雜題分析

Date: 2024-07-03

Preface

本文基於楊寧遠 @ynycoding 的課件與題單,對省選/NOIP階段圖論的建模方法和解題策略進行總結,以及本階段常用方法、模型和 Trick。

A. [AGC056C] 0/1 Balanced

[AGC056C] 01 Balanced - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

要求構造字典序最小的長為 \(n\) 的 0/1 字串 \(s\) 滿足 \(m\) 個條件形如 \((l,r)\) ,單個條件表示 \(s[l\dots r]\) 中必須有相同個 0/1。

其中 \(2\le n\le 10^6,1\le m\le 2\times 10^5\)

Solution

差分約束

題目中的限制很容易地就能用字首和表示,我們容易建立這樣的差分約束系統:

Def \(S_i\) 代表前 \(i\) 箇中 \(1\) 的個數

  • \(\forall (l,r),S_r-S_l=\frac{r-l+1}{2}\)

  • \(\forall i\in[1,n),0\le S_i-S_{i-1}\le 1\)

嗯,但是這樣會建立負權邊,只能用 SPFA 求解,時間複雜度最壞 \(\mathcal O(n)\)

我們想,如果能夠直接一點,每條限制 \(l,r\) 的表示不會與 \(l,r\) 相關,這樣邊權就大大簡化了

於是我們可以考慮定義 \(S_i\) 為前 \(i\) 箇中 \(1\) 的個數減去 \(0\) 的個數,這樣,第一類條件可以直接用等於表示,第二類條件則變為:\(\forall i\in[1,n),S_i-S_{i-1}\in \{-1,1\}\)

差分約束實際上求出的是最大的解,即對於所有 \(a+x\ge b\) 這樣的條件,求出的都是剛剛好滿足這些條件的解,即對於最嚴格的限制,滿足 \(a+x=b\)

考慮說明不會存在 \(S_i=S_{i-1}\) ,歸納假設 \(\forall j\in[1,i)\) 都滿足 \(S_j\neq S_{j-1}\)

\(i\) 沒有作為第一種事件的 \(r\) ,那麼顯然不可能存在這種情況。否則,則說明:\(S_l=S_i=S_{i-1} \) ,與歸納假設矛盾。

可以這樣理解,這種情況相當於填充空字元,但是如果只填一個肯定是沒用的,他也不能幫你構造合法方案,如果填了偶數個空格,不如把靠前的換成 \(0\) 靠後變成 \(1\)

同時,求解出了最大的解,只需要 flip 一下就是最小的解。

Conclusion

本題提示我們:

  • 可以利用字首和建立有關數量的限制

  • 儘量簡化邊權,消除與第三變數相關的因素,直接用等量關係以及固定邊權

  • 差分約束是求出最大的解

B. [NOI2001] 食物鏈

P2024 [NOI2001] 食物鏈 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

現有三種元素 \(A,B,C\) 定義他們之間有關係 \(A\to B,B\to C,C\to A\)

現有 \(n\) 個元素 \(|S|=n,\forall x\in S,x\in \{A,B,C\}\) ,按順序給出 \(q\) 個語句,每個都是以下的其中一種:

  • 給出 \(X,Y\in S\),指明他們滿足 \(X\to Y\)

  • 給出 \(X,Y\in S\),指明他們滿足 \(X=Y\)

現求這些語句有幾句不合法語句,即應用之後使得不存在一種賦值方案滿足前面所有的合法語句

Solution

典中典,並查集

使用擴充套件域可以很簡單地解決問題,現在看看邊帶權。

採用帶權並查集維護與當前父親的關係,這是一個迴圈的關係,使用 \(\mathbb F_3\) 關於 \(+\) 形成的群可以維護這個資訊。

在合併和路徑壓縮的時候維護即可。

Conclusion

  • 擴充套件域描述了物體的多個屬性

  • 邊帶權可以用來維護與父親節點的關係

C. CF118E Bertown roads

Problem - E - Codeforces

Problem Statement

給定無向連通圖 \(G\) ,現要將 \(G\) 中每條邊定向,要求定向後是強連通的,詢問是否可能並輸出方案。

Solution

注意到原圖只要是邊雙連通的即可,原因是,如果建立 dfs 樹,在任何一個點只沿著返祖邊往上爬一定能夠回到根節點,否則在無法這樣做的地方必然形成橋,這也給出了構造方案。

Conclusion

  • 基於 dfs 樹深度優先的性質,事實上,無向圖的 dfs 樹上的非樹邊沒有橫叉邊。

  • 基於上述性質,利用 dfs 樹的深度以及 dfn 序來解決一些與連通性有關的問題非常有用,例如 圖上二選一構造問題

  • Tarjan 利用追溯值來處理能夠到達的祖先,來確定子樹是否封閉(存在環),我們可以透過維護一個棧,在 \(low[x]=dfn[x]\) 時及時彈出來求出 \(\mathbf{eDCC}\)

D. 最大 XOR 和路徑

P4151 [WC2011] 最大XOR和路徑 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

給定帶權無向連通圖 \(G\),請求出一條路徑 \(P(1\to n)\) 使得對於路徑上的點 \(p_1,p_2,p_3,\dots,p_n\) ,其中 \(p_1=1,p_n=n\) ,最大化 \(\bigoplus\limits_{i\in[1,n)}w(p_i\to p_{i+1})\)

Solution

思維,線性基,DFS樹

這是一個好題,需要挖掘一些性質。

不難注意到以下事實:

  • 必選一條 \(1\to n\) 的簡單路徑和若干簡單環(從 \(1\) 出發可達的)

  • 這一條簡單路徑可以隨便選

那麼只需要在 dfs 樹上維護字首異或值,遇返祖邊直接線上性基里加入該環。

Conclusion

  • 可先從簡單的情況開始尋找性質,例如右圖

  • 然後加入環套環這樣的情況進一步尋找性質

  • dfs 樹可以用來找到簡單環

E. Edges in MST

Problem - 160D - Codeforces

Problem Statement

給定一個帶正權無向連通圖 \(G\) ,求每條邊是否是:最小生成樹的必須邊/可行邊

Solution

思維,Tarjan,並查集

考慮替換 MST 形成新的 MST,發現只有邊權相等的邊才能互相替換,但是這樣想是不方便進行維護的(您需要路徑修改相等邊集合)。

考慮構造性的思路,在 Kruskal 演算法構造 MST 的時候,對於所有邊權相等的邊 \(u_1,u_2,\dots,u_m\) ,如果 \(u_i\) 兩邊已經連通,則是不可能邊,否則,加入圖中跑 Tarjan,如果是橋邊,說明這是一條必須邊,否則是可行邊。

Conclusion

  • 對於最小生成樹問題,可以考慮三種思路:

    • 替換邊思路

    • 邊貪心構造思路(Kruskal、Boruvka)

    • MST 擴充套件思路(Prim)

F. Tourists

Problem - 487E - Codeforces

Problem Statement

給定無向連通圖 \(G\),點帶權,要求支援如下兩種操作:1. 單點修改點權 2. 求 \(a\to b\) 所有簡單路徑上最小點權的最小值

Solution

圓方樹,樹鏈剖分,Tarjan

我們維護的是無向圖上的簡單路徑資訊,而且還是路徑最小值,我們想想簡單路徑的構成,可以發現,如果一條路徑走入一個點雙,那麼我們就可以訪問點雙的任何一個點,然後從任何地方出來,這樣,點雙內部怎麼走我們就不需要知道,所以我們乾脆把點雙壓成一個點,然後修改的時候改歸屬即可。

如果你這麼想了,那麼恭喜!如果當年是你在 WC,那麼發明 圓方樹 的人就是你了。

那麼建立圓方樹,用 multiset 維護與方點相連的點的權值,樹鏈剖分建線段樹求最小值即可

Conclusion

  • 圓方樹主要是注意到維護的路徑資訊可以在點雙裡壓縮

  • 維護無向圖的路徑,優先考慮圓方樹,其次可以考慮在生成樹上處理(如 dfs 樹)

G. Too Many Constraints

Problem - 1697F - Codeforces

Problem Statement

要求你求出序列 \(a_1,a_2,\dots,a_n\),要求滿足若干限制:

  • \(\forall i\in[1,n),a_i\le a_{i+1}\)

  • \(\forall i\in[1,n],a_i\in [1,k]\cap \mathbb Z\)

  • 若干句要求,每條形如,\(a_i\neq x\)

  • 若干句要求,每條形如,\(a_i+a_j\le x\)

  • 若干句要求,每條形如,\(a_i+a_j\ge x\)

輸出方案,或者報告無解。

Solution

2-SAT

這種約束容易讓人想到差分約束,但是回顧一下三角形不等式的形狀,我們發現變數前面帶係數,這是不可以的。

我們發現 \(k\) 沒有多大,顯然每一個取值是否可以是很容易確認的,每一條要求都是在值域上面的一個限制,都是可以轉化為要求值域小於/大於一個值,我們發現這是不錯的。在應用了所有條件以後,我們要確定變數的值域,所以我們可以把 \(k\) 個取值都建立出來,每個條件就會排除其中一些,我們發現限制的後兩者說的就是 如果 \(a_i\) 取到 \(p\) 那麼 \(a_j\) 就必須取 \(\le x-p\) 的那些。

我們發現,如果ai取值p則bi取值q 很類似 2-SAT,可以將每個變數建立成一個變數,表示選或者不選。欸,問題來了,怎麼保證一個變數選且僅選一個值呢?

所以這樣是不行的,這幾個變數之間太獨立了,2-SAT 只能保證最多一個點選,無法保證一定有一個點被選,這時候,我們可以把變數的要求改為 \(x_i\) 是否 \(\le k\) ,這樣的好處是,我們可以透過欽定 “如果 \(x_i\) 不是 \(\le k\) 的,那麼就必須 \(\le k\)” 來欽定它必選。其他的很簡單,請自己補全。

Conclusion

  • 本題為我們提供了變數值域限制問題的新解法,透過拆值域建立 \(\le\) 來進行 2-SAT

H. 序列

#3629. 「2021 集訓隊互測」序列 - 題目 - LibreOJ (loj.ac)

Problem Statement

要求構造序列 \(a_1,a_2,\dots,a_n\) ,滿足以下限制:

  • \(\forall i\in [1,n],a_i\in [1,10^9]\)

  • \(m\) 個這樣的限制: \(a_i+a_j+a_k-\max(a_i,a_j,a_k)-\min(a_i,a_j,a_k)=x_i\)

輸出方案,或者報告無解。

Solution

2-SAT

注意到第二個資訊是指 \(a_i,a_j,a_k\) 的中位數必須是 \(x\)

那麼我們發現,要使得中位數為 \(x\) ,則至多隻能存在一個數大於 \(x\),至多隻能存在一個值小於 \(x\),這樣剩下的那個數顯然就即不能大於 \(x\) 又不能小於 \(x\),就只能為 \(x\),這樣就可以了。

這就很想上一個題目,但是,這值域太大了吧?但是一想,用到的資訊其實沒有那麼多,大部分值域都沒有用。我們考慮簡化值域的方法即離散化,這個題能不能離散化呢?

可以!考慮若對於資訊 \((a_i,a_j,a_k,x)\) ,對於其中確定為中位數的那個,只能選擇 \(x\),對於其中不為中位數的其餘兩個數,例如若 \(a_i\le x\) ,且在最後方案裡面 \(a_i\notin \{x_k\vert k\in[1,m]\}\) ,我們考慮這種方案可以被替換成其他的限制的元素(您可以模擬一下不同情況)。

那麼我們直接離散化即可。

Conclusion

  • 對於取值限制問題,應該儘量思考每個變數的取值對於其他變數有什麼影響

  • 對於取值限制問題,儘量減小每個變數的值域

I. Flip and Reverse

Skipped, TBD

J. Red-Blue Graph

Skipped, TBD

K. 圓桌問題

P3254 圓桌問題 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

現有 \(m\) 種不同顏色的球每一種 \(r_i\) 個,有 \(n\) 個盒子每個容量不同分別是 \(c_i\),要求將所有球分配到盒子裡,要求每個盒子裡不能包含相同顏色的球,輸出任何一個方案或者報告無解。

Solution

網路流

網路流的題目沒有很明顯的特徵,但是本題資料範圍很小,可以考慮。

我們可稱本題的模型為 選擇貢獻-數量限制模型

建立要進行數量限制的單元,本題有三種數量限制:

  • 球數限制

  • 容量限制

  • 貢獻數量限制

提取並建立

Conclusion

  • 選擇貢獻-數量限制模型 應該準確提取對題目中元素的限制是什麼,把限制的提供者和貢獻的流向建出來

L. 蜥蜴

P2472 [SCOI2007] 蜥蜴 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

在一個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓儘量多的蜥蜴逃 到邊界外。

每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何一個石柱上。

石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1(如果仍然落在地圖內部,則到達的石柱高度不變),如果該石柱原來高度為1,則蜥蜴離開後消失。以後其他蜥蜴不能落腳。任何時刻不能有兩隻蜥蜴在同一個石柱上。

Solution

網路流,最大流

本題和上面那個題的模型是一樣的,直接建圖即可,不再贅述。

M. 魔術球問題

P2765 魔術球問題 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

假設有 n 根柱子,現要按下述規則在這 n 根柱子中依次放入編號為 \(1,2,3,\dots\) 的球。

  1. 每次只能在某根柱子的最上面放球。
  2. 在同一根柱子中,任何 2 個相鄰球的編號之和為完全平方數。

試設計一個演算法,計算出在 n 根柱子上最多能放多少個球。

Solution

最大流

其實此題和前面的模型也是一樣的,但是有一點不同的

此處我們最大流的含義是,前面最多少開幾個柱子,即最多合併幾次,每一次加一個數 \(x\),加邊 \(S\to in_x,out_x\to T\) ,對於所有 \(y<x,x+y=a^2,a\in\mathbb N^*\) ,加邊 \(in_y\to out_x\) ,即可以把 \(y\) 整個接到 \(x\) 後面,節省了一個柱子。

網路流是一種會調整之前流量的演算法,故在殘量網路上跑最大流的過程包含了進行退流和重新推流的過程,前者表示拆分一個已經合併的柱子,取消之前的一次合併,後者表示進行一次合併。

Conclusion

  • 最小消耗可以轉化為最大節省,常常是最大化合並

  • 利用網路流的退流,要處理有順序的問題時,可以依次加入點,然後再殘量網路上跑最大流即可

N. 危橋

P3163 [CQOI2014] 危橋 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Solution

本題比較玄學,要求強大的注意力,筆者也沒有這樣的注意力,遇到這種題只能自認倒黴。

P3163 [CQOI2014] 危橋 題解 - 洛谷專欄 (luogu.com)

Conclusion

沒有

O. Bricks

Problem - 1404E - Codeforces

Problem Statement

你有一個 \(n\times m\)\(1\le n,m\le 200\))的格子紙,格子要麼塗黑(#)要麼塗白(.)。你需要用若干個長為一,寬為任意正整數或者寬為一,長為任意正整數的長方形去覆蓋所有黑色格子,要求不能蓋到白色格子上,不能蓋到其他長方形上,不能蓋出格子紙的邊界,求最少用多少個長方形。

資料保證至少有一個黑色格子。

Solution

最大流,二分圖,最大匹配,最大獨立集,最小割

本題與 M 題類似,都是要最小化一個花費,我們發現可以把兩塊相連同向的木板連成一塊,這啟發我們用上面同樣的方式,我們在兩個單元格之間建立一個點,我們發現,如果一個格子上/下面的點和左/右邊的點同時被選,則是不合法的,所有我們把所有上下的點放在二分圖左部,左右的點放在右邊,中間不能同時選的連邊,此時答案就等於二分圖的最大獨立集。

Conclusion

我們有必要檢視幾個常用結論

  • 最大流=二分圖最大匹配=最小割=最小點覆蓋

  • 補圖的最大獨立集等於原圖最大團

  • n-二分圖最大匹配=n-二分圖最小點覆蓋=n-二分圖最小割=最大獨立集

  • DAG的最小路徑點覆蓋=n-拆點二分圖的最大匹配,最小路徑可重複點覆蓋可先傳遞閉包再做普通最小路徑點覆蓋

  • 本題用到的結論可以透過構建一個圖跑最小割證明,即 n-二分圖最小割=最大獨立集

P. 文理分科

P4313 文理分科 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

小 P 所在的班級可以用一個 \(n\times m\) 的矩陣進行描述。現每人必須從文科和理科中選擇一科。選擇科目會獲得一個滿意值:

  • 如果第 \(i\) 行第 \(j\) 列的同學選擇了文科,則他將獲得 \(art_{i,j}\) 的滿意值,如果選擇理科,將得到 \(science_{i,j}\) 的滿意值。

  • 如果第 \(i\) 行第 \(j\) 列的同學選擇了文科,並且他相鄰(四連通)的同學全部選擇了文科,會增加 \(same\text{\underline{ }}art_{i,j}\) 的滿意值。

  • 如果第 \(i\) 行第 \(j\) 列的同學選擇了理科,並且他相鄰的同學全部選擇了理科,則增加 \(same\text{\underline{ }}science_{i,j}\) 的滿意值。

求最大滿意值之和。

Solution

最小割

這是一種新的最小割模型 ,我們知道最小割這種東西就是用來計算代價的。那麼我們不妨假設全部貢獻都已經獲得,對於每一個人,顯然只能選擇一科,不妨表示為 0/1,則問題變為一個變數取值的問題。現在考慮怎麼限制條件二三。考慮新建一個節點,把它與所有牽涉到的人連一條 \(+\infty\) 的邊,然後連到原點,權為對應的 \(same\_xxx\) 貢獻。

Conclusion

  • 最小割是用來計算代價的,假設全部貢獻已經獲得就可以化為最小割

  • 不妨考慮如果不滿足要求,怎麼樣才可以阻礙這種情況形成,除非放棄貢獻,支付代價。

Q. 切糕

P3227 [HNOI2013] 切糕 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

有一個 \(n\times m\) 的矩陣 \(a_{i,j}\in [1,R]\) ,每個位置及這個位置的數合起來有一個權值 \(v(i,j,a_{i,j})\) 。現在給出這個所有的權值 \(v\) ,求滿足相鄰位置(上下左右)的值之差 \(\le D\) 這一限制的情況下,權值和最小是多少,即使得 \(\sum_{x,y}v(x,y,a_{x,y})\) 最小。

\(1\le n,m,R\le 40,0\le D\le R\)

Acknowledgement: @lupengheyyds

Solution

最小割

本題即切糕模型,用於解決離散變數取值問題,不同取值有一個貢獻,而不同變數之間又有限制,形式常為變數差/和大於/小於給定值。

此時我們建立一條鏈,表示所有可能取值,割掉即表示選擇這個取值(如何保證只取一個?代價非負),然後嘗試阻礙不合法的情況形成,只需要向對應的變數連邊。

R. 狼抓兔子

P4001 [ICPC-Beijing 2006] 狼抓兔子 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Problem Statement

即給定一個加上所有左上到右下斜邊的網格圖,求最小割。

Solution

最小割,平面圖

重要定理:平面圖最小割等於其對偶圖的最短路

S. Starry Night Camping

Starry Night Camping - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

Skipped, TBD

T. 太空飛行計劃問題

最小割

比較簡單,跳過

U. order

是上面那個的推廣,也比較簡單。

V. Dominance

把座標系轉 45° 然後就變成掃描線。

Postscript

啊啊啊啊啊寫完了

感受思維的脈搏

相關文章