NOIP2018 復盤
NOIP2018 復盤
前言
在這裏立一個可能無法實現的flag:
把NOIP從古至今(luogu上有)的每一年都寫一篇復盤!!!
伏拉格綜合征開始了
在復盤就不講那些傷心的話了。
D1T1 鋪設道路
考試時居然不知道這道題是原題。。。
一共有兩種做法:
遞推/貪心。
設一個數組\(f\),順序遍歷。是這麽更新的:
\[f[i]=f[i-1]+max(0,a[i]-a[i-1])\]
反正我沒做過原題想不出來分治。
弄一個遞歸的函數,暴力統計區間最小值,暴力區間減,再來一個遍歷找出斷點,把所有的答案加起來就完事了。
但是據說這種做法是會被卡成\(O(n^2)\)的。但是幸好NOIP的數據沒卡。
不然我就省四退役了
代碼:
D1T2 貨幣系統
最初的想法是在一個大一點的範圍內看看表示的會不會一樣多。
不知道為什麽就發現:只要看看能否表示出給你的所有貨幣。
從小到大排序,選到能表達出所有貨幣為止。
表示方法有兩種:
dfs暴力搞。
暴力枚舉出每一個數前面乘的數,看看能否表達就是了。
但是這種做法因為效率不高而只能搞80pts。
dp背包方案。
因為任何一種貨幣都能選到夠,所以這不就是完全背包嗎?
所以使用完全背包,從能夠表達的狀態轉移到另一個狀態即可。
同時,這個dp數組是可以循環利用的。如果每次枚舉選幾種貨幣的話會T掉。
這個就是正解了。
代碼:
D1T3 賽道修建
待填。。。
D2T1 旅行
這道題讓我認識了什麽叫做基環樹!
這道題就是兩個部分分:\(m=n-1\)或\(m=n\)。
\(m=n-1\)部分明顯就是一棵樹,那需要看怎麽遍歷這棵樹才能得到答案。
仔細觀察可以發現:把所有的邊從小到大排序,然後從1節點開始遍歷即可。60pts到手!
剩下的\(m=n\)部分分就是重點了。
基環樹有這麽幾個性質:
- 基環樹斷了一條邊可能就是一棵樹。
- 基環樹有且只有一個環。
再看到數據範圍:\(1 \leq n \leq 5000\)!
結合去年的i7 8700k,不由得讓你想到了\(n^2\)算法!
所以算法出來了:枚舉所有的邊,每次斷掉其中的一條邊,在新圖上面dfs,求出最小字典序的答案。
還想優化?先跑一遍tarjan的點雙,若一條邊的兩個端點屬於同個點雙即為環上的邊,在上面斷邊,會去掉那些不是樹的斷法。
在luogu上面這兩種做法開O2都是能過的。
加強版不會做
代碼:
D2T2 填數遊戲
待填。。。
D2T3 保衛王國
動態dp。這輩子都不可能學的。
NOIP2018 復盤