1. 程式人生 > 其它 >「題集」精緻的袖珍題目

「題集」精緻的袖珍題目

一些體量比較小,但是有一定價值和一些閃光點的題目(也許就是想水幾篇題解

[NOIP2008 提高組] 雙棧排序

題目連結:洛谷


考慮兩個位置不能被放入同一個棧中的條件。

通過多次手玩可以發現,如果有 \(i<j<k,a_k<a_i<a_j\),則 \(i,j\) 不能被放入同一個棧中。

\(a_i<a_j\) 要求 \(i\) 先於 \(j\) 出棧,但是 \(i\) 想要出棧就必須要 \(j\) 入棧,所以 \(j\) 要先於 \(i\) 出棧,因此矛盾。


一定要注意這個 \(k\) 的存在,才能保證 \(j\) 必須要進棧。

現在我們有兩個棧,這就說明我們需要將所有位置分到兩個集合當中,滿足每個集合中元素兩兩不衝突。分集合可以看作對點染色,而染色的要求就是,對於任意一對衝突的 \((i,j)\)

\(i,j\) 顏色不同。不難發現這是將所有的 \((i,j)\) 當作邊加入圖中後,對圖進行黑白染色,模擬操作即可。如果不存在染色方案,那麼就應該輸出 0。

假如我們知道了染色方案,我們可以貪心地構造出操作序列——只需要每一輪貪心地選取字典序最小的合法操作即可。操作序列中 a 的位置由染色方案限制,因此我們需要儘量讓較小的位置可以被放入第一個棧中,貪心地染色即可。

小結:

  1. 對於重要結論,一定保證正確,不能缺漏或者不完整。一定要用多種資料來檢查,最好可以給出嚴謹的說明/推導!
  2. 注意將問題轉化到圖上這種研究方式,直觀清晰;轉化看物件的角度常常是有效的。

AC 記錄

[CF1064D/CF1063B] Labyrinth

題目連結:CF洛谷


\((x_0,y_0)\) 出發到達 \((x_1,y_1)\) 的時候,可以發現向左/向右的次數必然滿足一條等式關係:

\[x_1-x_0=R-L \]

那麼只需要最小化其中一個量即可。

小結:

注意隱含條件:如果遇到多個變數的問題不方便轉化,不妨入手看看特定情況下(某些資訊列舉/推算之後)有沒有變數之間的關係

[CF877D] Olya and Energy Drinks

題目連結:CF洛谷


每個位置在行和在列上可以到達的位置是一段區間,因此我們可以使用 set 維護每一行、每一列上未被遍歷的位置

小結:這裡利用了 BFS 的特性(每個點只需要被遍歷到一次),同時也利用了圖的特性。注意使用資料結構維護有效點的方法

使用線段樹優化建圖 +0/1BFS 應該也有正確的複雜度,不知道為啥過不了。