前言
ABCDE + 口胡 F + 口胡 G 假做法,三分之一偽 AK(?
正文
A
?
B
?
C
?
D
構造一個環形遞增矩陣即可。
E
考慮何時才有一個非降序列。
令 \(val_x\) 為點 \(x\) 的權值。
對於一個相鄰的點對 \((u, v)\),可以分成三種情況:
- \(val_u > val_v\)
此時只有 \(v \to u\) 的可能,\(v\) 向 \(u\) 連邊。
- \(val_u < val_v\)
類似上一種情況,\(u\) 向 \(v\) 連邊。
- \(val_u = val_v\)
此時無論是經過 \(u\) 還是經過 \(v\) 或是 \(u, v\) 兩點都經過,它們的貢獻都一樣,將 \(u, v\) 縮成一個點即可。
不會吧不會吧不會有人這種縮點用 tarjan 吧???
對不起,我紫菜。
你怎麼知道我 tarjan 縮點然後調 30 min 弘文了?
並查集維護縮點操作。縮點後跑 DAG 上最長路即可。toposort 可以勝任。
注意是在縮點之後重新編號連邊。
時間複雜度 \(O(n\alpha (n) + m)\)。
F
首先設 \(dp_i\) 為到第 \(i\) 格的填色方案。
你會想到一個 naive 的向後轉移:
時間複雜度 \(O(n \frac{n}{V})\)。
有另一個 naive 的轉移,是去考慮 \(dp_i\) 從前面的何處轉移而來的。
顯然 \(dp_j \to dp_i\) 的條件是 \(j + k \times a_j = i\),轉換得:\(i \equiv j (\mod a_j)\)。
維護 \(DP_{i, j}\) 表示模 \(i\) 位置為 \(j\) 的方案總和,那麼有:
對 \(DP\) 有懶轉移:
時間複雜度 \(O(nV)\)。
此時兩個轉移的複雜度跟 \(V\) 相關並且兩種狀態完全一致,不妨考慮對轉移過程根號分治。
欽定閾值 \(V = \sqrt {\max_{i \in [1,n]} \left \{ a_i \right \}}\),若 \(a_i > Lim\) 則用第一種方式轉移,反之用第二種方式轉移。
時間複雜度 \(O(n \sqrt {\max_{i \in [1,n]} \left \{ a_i \right \}})\)。
G
想到了一個正確機率很大的東西但是會被構造資料卡掉的方法,丟人,不說了。
總結
打得算好的,因為 ABCD 沒什麼分討不容易寫掛算是有點運氣成分,E 想 + 調了接近 65 min,F 口胡出來了但是某些細節還是沒注意,G 是數學確實不會做,確實是純菜了。
後面還是得注重訓練碼力和刻意記住某些經典的 trick,因為某些題目的關鍵點就可能是某個 trick 的延申。