1. 程式人生 > 其它 >CSP-S 2021 補題記錄

CSP-S 2021 補題記錄

賽時傘兵思路請瀏覽CSP-S 2021 遊記

按題目難度升序排序。對某排題人充滿無限的惡感。

[CSP-S 2021] T3 迴文 palin

一個比較顯然的事實:第一次選出來的數,它的第二次出現必然在最後。

假設我們已經選出了一個數,那麼考慮在選第二個數的時候必須使它們在最後連續地出現。然後就做完了。

具體到實現,每一次從頭/尾取一個數,處理出這個數第二次出現地位置。考慮如果合法,它們第二次出現地位置一定會在序列中間形成一段連續的區間。所以只需要判一下最後能不能在中間這個區間外選完其他所有數就行了。

還有一個小考慮,就是這個做法和直接爆搜有點像的地方在於它看起來也需要從正反兩面去考慮是否合法。然而可以證明這是不用的。我們可以考慮每次選走一個數,中間的區間必然擴大,更有可能使後面的數被選入,所以每次合法的選擇都是不劣的,所以放鬆地貪心去選即可。

複雜度 \(O(\sum n)\)code

[CSP-S2021] T1 廊橋分配 airport

看上去就應該有個 \(O(nlogn)\) 做法,就往資料結構這方面想。

首先按照暴力的思路,我把所有航班都對映到時間軸上,在時間軸上想辦法。

可以發現,由於先到先得的原則,一架飛機停在廊橋上的代價是固定的。

(讀者自證不難) 就大概手玩一下就發現了。說明起來挺麻煩的。

那麼就可以預處理每一架飛機的代價,然後做個字首和,最後列舉分配方案統計答案即可。

具體到實現,可以假定現在有無限的廊橋,用一個小根堆維護當最小的空閒廊橋,每次貪心地填進去就行了,然後記錄下這個最小的廊橋,該飛機的代價就是該廊橋的編號(即至少要這麼多的廊橋才能放的下它)。然後把代價統計進一個計數桶裡,做個字首和。列舉分配方式,從兩邊的字首和陣列中直接查詢取最大值即可。

時間複雜度 \(O(nlogn)\)code

[CSP-S 2021] T2 括號序列 bracket

首先這個資料範圍就非常明顯地提示是個 \(O(n^3)\) 大概就是個區間 \(\rm{DP}\) 啥的可是我當時就是連暴力都打不出來。

賽後。。。考慮根本無需考慮題目給出的“超級括號序列“有什麼性質,只需直接根據定義無腦區間 \(\rm{DP}\) 就行。

從定義去考慮解法,我們設 \(dp[l][r][type]\) 表示在區間 \([l,r]\) 內滿足 \(type\) 性質的串的方案數。

  • \(type=1\)\(A/B\) 型括號序列。
  • \(type=2\) :全是小星星括號序列。
  • \(type=3\)***A 括號序列。
  • \(type=4\)A*** 括號序列。
  • \(type=5\)***A*** 括號序列。
  • \(type = 6\)\(S\) 型括號序列。

雖然但是,懶得 \(\LaTeX\) 了,就看情況轉移一下,具體看程式碼。

時間複雜度 \(O(n^3)\) ,帶了 \(6\) 倍常數。code

[CSP-S 2021] T4 交通規劃 traffic

在補了在補了。預計 \(\rm{NOIP}\) 前應該能補完罷 \(\rm{Q \omega Q}\)

//Good luck