NOI 2020 部分題目題解

2021-10-23 15:02:00 字數 1413 閱讀 1074

這個資料範圍,就是告訴我們這道題要矩陣快速冪。

先考慮 k=0

k=0k=

0。把每個點拆成五個點,那麼邊權都為 1

11,然後是乙個 floyd 求最長路。轉移是廣義的矩陣乘法,滿足結合律,可以套上矩陣快速冪。

k ≠0

k\neq 0

k​=

0 我考場的做法比較暴力,直接把美食節的時間排序,分段暴力求。時間複雜度是 o

(125×n

klog⁡t

)o(125 \times n^3 \times k \log t)

o(125×

n3×k

logt

),55 分走人。

矩陣乘法是乙個答案矩陣乘上乙個轉移矩陣,因為我們是從 1

11 出發的,所以答案矩陣只要第一行就行了。時間複雜度為 o(25

×n2×

klog⁡t

)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...