這個資料範圍,就是告訴我們這道題要矩陣快速冪。
先考慮 k=0
k=0k=
0。把每個點拆成五個點,那麼邊權都為 1
11,然後是乙個 floyd 求最長路。轉移是廣義的矩陣乘法,滿足結合律,可以套上矩陣快速冪。
k ≠0
k\neq 0
k=
0 我考場的做法比較暴力,直接把美食節的時間排序,分段暴力求。時間複雜度是 o
(125×n
3×
klogt
)o(125 \times n^3 \times k \log t)
o(125×
n3×k
logt
),55 分走人。
矩陣乘法是乙個答案矩陣乘上乙個轉移矩陣,因為我們是從 1
11 出發的,所以答案矩陣只要第一行就行了。時間複雜度為 o(25
×n2×
klogt
)o(25 \times n^2 \times k \log t)
o(25×n
2×klogt)
。考試時沒發現 n−2
≤m
n - 2 \leq m
n−2≤
m 的性質,去想網路流了而爆零。
回到正題,這個性質就是告訴我們這道題不是網路流。然後部分分有個 n−1
≤m
n - 1 \leq m
n−1≤
m,那麼考慮 n−1
=m
n-1 = m
n−1=
m 如何構造。
每次把最小與最大的 d
dd 取出來做乙個菜,最小的 d
dd 會被用完,再把餘下的最大的 d
dd 丟回去,相當與把問題規模縮小了,可以發現這樣構造是對的,用平衡樹或 set 維護一下。
對於 n≤m
n \leq m
n≤m,可以每次選最大的那個 d
dd 去做菜,再扔回去直到 n−1
≤m
n - 1 \leq m
n−1≤m。
對於 m=n
−2
m = n - 2
m=n−
2,考慮將 n
nn 個原料分成兩個可重集合,如果兩個集合的和都為 k(∣
s∣−1
)k(|s|-1)
k(∣s∣−
1),那麼就相當於拆成兩個 m=n
−1
m=n-1
m=n−
1 的情況。這是乙個典型的 01 存在性揹包,複雜度是 o(n
2k
)o(n^2k)
o(n2k)
的。因為狀態只有 01,可以用 bitset 優化,時間複雜度 o(n
2k64)
o(\frac)
o(64n2
k)。
NOI2020 簡要題解
a 首先不難發現乙個暴力動態規劃的做法 記 f 表示第 i 天 當前在第 j 座城市所獲得的最大收益 有轉移方程 f max u cost i extra 發現 w 非常小 考慮拆點。將每個點拆成 w 個點 那麼一共會有至多 5n 個點。接著 考慮矩陣乘法 事實上 將求和運算改為 max 運算 並將...
NOI2020 製作菜品 題解
題意分析 給出 n 個數和 m 個 k 可以某些 k 拆兩個正整數,使得拆後的數可以拼成給出的 n 個數。思路分析 上面的解釋是因為這樣寫比較方便,實際上按照題意應該是用 n 個數拆分拼成 m 個 k 觀察資料範圍,發現有 m geq n 2 的限制和 m geq n 1 的部分分,考慮從這裡切入分...
NOI2020 美食家 題解
題意分析 給出乙個帶權有向圖,要求從節點 1 出發,經過恰好 t 的邊權和,回到節點 1 求可經過的最大點權和。特別地,經過的邊權和達到部分特殊數時,會有某個點的點權發生改變。思路分析 樸素演算法 設 f 表示在節點 j 經過的邊權和為 i 時可經過的最大點權和。很容易可以得出 dp 方程 f ma...