最近經常刷一些奇奇怪怪的小題目,就隨手開篇記錄一下趴~spa
CF700B Connecting Universities —— 思惟 - 分析答案上下界
orm
分別考慮每條邊的貢獻。要通過這條邊,說明匹配的點中有一個在子樹外部,一個在子樹內部。若子樹內部共有 \(size[u]\) 個點,那麼最大的貢獻即爲 \(min(size[u], 2 * K - size[u])\) 。如何證實必定能夠達到這個上界 / 這個上界對於全局必定最優?假若一條邊的貢獻在答案中沒有到達上界,說明至少有一對點在子樹內部匹配,一對點在子樹外部匹配。若是這時候變成兩對子樹內外的匹配,顯然本來產生了貢獻的邊均不會失去貢獻,而又會通過更多的邊,必然更優。因此每條邊必定會達到這個上界值。it
CF732F Tourist Reform —— 思惟 - Tarjan縮點 & 貪心
form
首先能夠明顯的發現,若是原圖中存在有環,咱們可使得這個環上的點能夠兩兩到達。因此咱們將這些環縮起來,則每個強連通份量中每一個點所能到達的點的下界即爲強連通份量的大小。縮完點後咱們獲得的是一棵樹,那麼不論咱們如何調整,總會有一個強連通份量的出度爲0,也就是該強連通份量中的點的答案爲最小值——該強連通份量的大小。咱們顯然讓點數最大的做爲這個‘根’。dfs肯定答案便可。class
CF500C New Year Book Reading —— 奇怪的題 - 貪心 & 模擬遍歷
我想這題居然都想了一下子(撞牆)。這個把書放到最上面的操做實際上就已經表示若是閱讀,那麼它的位置與擺放位置無關。因此咱們直接按照每本書第一次出現的時間次序爲擺放次序就好啦……sso
CF842D Vitya and Strange Lesson —— 套路 - trie樹 & 總體操做
技巧
看到與位運算有關的第一個想到trie樹,若是沒有第一個操做而僅僅是求 mex 的話,咱們就是在trie樹上找到最靠左邊的第一個空位。咱們能夠記錄一下trie樹上的每個節點的子樹是否已經滿,貪心的走儘可能靠左的一邊便可。異或的操做因爲是對於全局而言的,咱們考慮直接在trie樹上進行操做。異或上的數 x 若是在第 k 位上有 1,實際上就是原序列中的每一個數在這一位均翻轉一次。在trie樹上走的時候咱們人工轉換一下翻轉關係就行。統計
CF981D Bookshelves —— 技巧 - 貪心 & dpdi
若是咱們暴力dp的話,這確定是不行噠。不過再一次看到位運算,咱們有高位 -> 低位貪心鴨。咱們考慮當前的第 K 位是否可以爲 1,咱們就設立狀態 f[i][j] 表示 dp 到第 i 位,已經分紅了 j 段,是否是可以知足異或值爲 ans | (1 << K) 。若是能夠,咱們則將(1 << K) 加到答案中,不然跳過。複雜度成功降到 \(n^{2}logm\) (m 爲值域範圍)。
CF771C Bear and Tree Jumps —— 思惟 - 樹形dp
我太菜啦……這題若是K均爲1,那麼咱們只須要對於每一條邊統計一會兒樹內與子樹外的邊便可。但因爲K能夠取1~5,那麼當兩點之間的距離不足K的時候,咱們須要向上取整。例如 K=4 的狀況,對於一條長度爲11的路徑,咱們須要跳 (11 + 1) / 4 = 3 次。因此咱們能夠考慮把每條路徑的長度補全成爲K的倍數,令這些被加上去的剩餘值爲res,兩兩點之間的距離之和爲 ans,最後的答案就是 (res + ans) / K。設立狀態 f[u][j] 表示以 u 爲根的子樹內,距離 u 的路徑長度 % K = j 的點有多少個。因爲 K 的範圍很小咱們 \(K^{2}\) 枚舉一下轉移 & 統計答案。
CF1070F Debate —— 貪心
這題的貪心策略挺明顯的。因爲 a 和 b 的個數要求相等,那麼假如最後 a 類型選擇了 x 我的, b 類型若是人數大於等於 x,毫不會選擇小於 x 我的(收益都是正數)。因此實際上 a 類型和 b 類型的人必定都會取走 min(cnta, cntb) 個。把剩下的和非 a 也非 b 類型的丟在一塊兒貪心取最大值直到沒有辦法取了爲止。
CF348D Turtles —— 思惟 - 性質 & dp
很妙妙啊!若是不考慮相交的狀況,咱們只須要求出 Cal(2, 1, n, m - 1) * Cal(1, 2, n - 1, m) 就是答案。但是因爲有相交的狀況,咱們考慮用所有的減去相交的部分。咱們能夠在兩條相交的路徑的最後一個相交點的位置翻轉兩條路線,則此時圖上的兩條路線一條爲\((2, 1) -> (n - 1, m)\),一條爲\((1, 2) -> (n, m - 1)\)。此時,這兩條路徑依然在最後一個相交點的位置相交,也就是咱們在這兩種方案之間創建起了一一對應的映射關係。因此不合法的方案總數即爲 Cal(2, 1, n - 1, m) * Cal(1, 2, n, m - 1)。
CF527E Data Center Drama —— 圖論 - 歐拉回路&構造
感受有點點套路?好像不少歐拉回路的構造都差不太多的樣子……因爲要保證度數都是偶數,首先這張圖上必須存在一條歐拉回路。又由於一條邊必定貢獻1的入度 & 1的出度,因此必定有偶數條邊。咱們能夠把圖補全變成歐拉回路圖,若是此時邊數爲奇數則隨便添加一個自環。遍歷歐拉回路將邊間隔取反便可。
CF547D Mike and Fish —— 圖論 - 歐拉回路&構造
仍是同樣的……每一個點的紅藍點數相差不超過1,咱們能夠把點 (x, y) 看作一條 (x -> y) 的邊。這樣就轉化成了一個二分圖。咱們能夠先把圖補全成歐拉回路圖後先從原圖中的奇點補全的邊開始遍歷,紅藍相間染色。爲何這樣是對的呢?首先對於一個歐拉回路圖來講,一個點進入一次,必然會要出去一次,因此與之相連的紅藍邊數都是相等的。惟獨最開始遍歷的點不必定知足這個要求,由於第一次出去和最後一次回來的邊顏色可能相同。若是最開始遍歷的點是奇點,那麼第一條遍歷的邊就是咱們添加的虛邊,顏色可有可無,顏色相差數爲1;若是最開始是偶點,圖又是個二分圖,咱們知道出邊的顏色必然等於入邊。因此這樣構造出來的圖必定是知足題意的。
AGC016C Tree Restoring —— 大力推結論
應該說比較簡單?首先能夠求出全部長度中最小的和最長的分別爲 mn 和 mx。顯然有 mx 爲直徑。而 mn 必定出如今直徑的中間,首先判斷一下最小值的個數是否知足要求。以後對於全部值大於 mn 的看是否出現了兩次及以上,由於直徑是對稱的,因此至少要出現兩次。多餘的能夠在對應的位置增長一個分支(毛毛蟲)來構造。
CF735D Taxes —— 奇怪奇怪 - 哥德巴赫猜測??
有點奇葩的感受……首先不難發現咱們要使得代價最小,那麼確定要將 n 分紅儘可能少的幾個質數。若是一個數可以被拆分紅質數 p * q (其中 p 是它的最小質因子),那麼咱們能夠把它拆分紅 q 個 p,這樣並不會使得答案更劣……而後……就上哥德巴赫猜測了?一個 >= 2 的偶數必然可以拆分紅兩個質數,一個奇數若是不是質數咱們能夠把它拆成一個質數和一個偶數。這樣就完了……