NOIP 考前研究
NOIP 2017 試題研究
D1T1 小凱的疑惑 (45 min)
看到題面,大概是推數學公式。
先打暴力表,觀察 \(a,b\) 與 \(n\) 的關係。猜想 \(a×b−a−b\)。
引理:對於正整數 \(p , q\) 滿足 \(\gcd(p, q) = 1\), 使得 \(px + qy = n\) 無非負整數解的最大正整數 \(n\) 為 \(pq - p - q\).
使用反證法證明,即假設存在正整數 \(x\) 和 \(y\) 使得 \(px + qy = pq - p - q\),證明矛盾。期望得分 100 分。
沒辦法一眼望穿?觀察到答案更接進於 \(a\times b\)
D1T2 時間複雜度 (1 h)
一眼望穿,模擬 + 字串 + 棧結構。
然後死在模擬的過程中……期望得分 0 分。
絕對不能沒把整個題目推完就開始寫。先在草稿紙上把所有要注意的點寫出來,列出清單。
在草稿紙上列出模擬的所有標記變數的含義和作用。在草稿紙上寫出大致程式碼層結構,標出特判和標記變數作用的位置。(其實程式碼大致就出來了。)
上機實現。期望得分 100 分。
此類題目(模擬 + 字串)嚴重考察細心和耐心。如果你的思路清晰,程式碼嚴謹工整,就不會過不去樣例……
D1T3 逛公園 (45 min)
DP + 拓撲序 + 最短路
觀察題目。啥都看不出來?先打暴力。
容易發現,Day 1 還沒有考 DP。注意到 \(K\le 50\),猜測這是一個與 \(k\) 有關的 DP。
特殊情況 1:當 \(K=0\) 時,最短路計數!
最短路計數:
Dijkstra 堆優化 或 SPFA(死了)。
定義一個新變數陣列
cnt
,cnt[S]=1
。更新邊長的時候如果大於號就覆蓋(cnt[to[i]]=cnt[x]
),相等的話(即有相同最短路徑)就相加(cnt[to[i]]+=cnt[x]
)。無邊權即邊權為 1。注意模法。實現難度 [普及+/提高]。
期望得分 30 分。
特殊情況 2:然後考慮 沒有 0 邊 的情況。構造 DP 求解。寫不出來……期望得分 30 分。
然後回過頭檢查 T1、T2 的程式碼。千萬不要放空!放個 rand()%mod
也行啊……要愛惜分數。
D2T1 乳酪 (45 min)
觀察到本題適合使用並查集。(NOIP 考點之一。)
距離要預處理。
實現難度 [普及/提高-]。期望得分 100 分。
D2T2 寶藏 (1 h 30 min)
狀壓 DP。思路難想!期望騙分 0 分。
寫不出來狀壓 DP……顯然要考慮部分分。DFS + 剪枝!暴搜演算法的時間複雜度是 \(O(\)玄學\()\)。不要忘記低階演算法的重要性,暴搜 AC 什麼的大有人在。期望騙分 ?? 分。
D2T3 列隊 (45 min)
標算是樹狀陣列。想不到……想到了也不會寫……
考慮部分分採用離散化思想。
對於 \(x_i=1\) 的情況,轉化為:
對於一個序列,支援操作 (1) 刪除第 \(k\) 個元素;(2) 在末尾新增一個元素。
嘗試用樹狀陣列實現。
維護一個 01 序列,第 \(i\) 位上是 0 表示這個位置上的數已經被刪除了或者還沒有被插入,第 \(i\) 位上是 1 表示這一位上的數沒有被刪除。
那麼刪除操作就是 1 → 0,插入操作就是 0 → 1。第 \(k\) 個元素就是字首和為 \(k\) 的位置。樹狀陣列二分。
其他就完全不會了。期望得分 30 分。(模擬得分)
總結
樂觀估計為 360+?? 分。可見去年的難度還是很高的。如果暴搜寫得給力能拿 400 分,如果字串模擬炸了,那就省一無望了。(畢竟去年 FJ 省一線 300 分。復旦自招線 360 分……)
如何發揮超常正常?首先該拿的分數堅決不能丟掉。字串模擬、暴搜剪枝,還有最短路和並查集的板子,一定要寫出來。DP 能推的儘量推,部分分能騙的儘量騙……
明明所有考點都是 NOIP 範圍內的,明明我也會 DAG 上 DP、狀壓 DP、樹狀陣列……可見還是學藝不精,有待提高。
括號中標記的是完成核心程式碼的理論時間。實際上,一旦陷入 bug 的泥潭就很難出去了……
祝 NOIP 2018 RP \(\rightarrow\infty\)!