個人認為的難度排序:D1T1 < D2T1 < D2T2 < D1T2 < D2T3 < D1T3
兩天的\(T1\)都是很簡單的題,就不說了
\(D2T2\)代金券
- 題意簡述:有 \(n\) 道菜品,第 \(i\) 道菜品花費 \(a_i\). 可以使用價值 \(1\) 的消費券,初始時沒有消費券。
如果在一道花費 \(a\) 的菜品花費 \(b(b ≤ a)\)張消費券,則實際需要花
\(a - b\) 元,並在用餐結束后獲得 \(⌊ \frac{a-b} {c} ⌋\) 張消費券。
\(Q\) 次對序列 \(a_i\) 修改,每次修改結束后詢問按照順序品嘗 \(n\) 個菜品
的最小消費。
\(1 ≤ n, Q ≤ 3 × 10^5, 1 ≤ c ≤ 10^9, 1 ≤ ai ≤ 10^{12}\)
\(solution\)
- 考試的時候只差一步了.....但還是沒AC
- 我們考慮這么一個貪心,首先我們注意令\(d_i = a_i \bmod c,b_i = a_i - d_i\),注意到對於任意一個物品,\(d_i\)使用消費券是一定不劣的,而\(b_i\)個物品如果消費券能留到后面就盡量留到后面
- 所以我們有以下這么一個算法,每次購買\(b_i\),然后\(d_i\)個物品能用消費券就盡量用消費券,那么一定會存在一個后綴\(x\),使得\([x+1,n]\)的所有物品都可以使用消費券
- 那么對於\(x\),我們可以直接二分出要買多少個物品
- 如果是朴素的每次修改完遍歷復雜度是\(O(n*q\log A)\)的,我考試也只想到這步
- 注意到如果直接用數據結構維護這么一個過程是極其難以維護的,我們考慮繼續觀察性質,我們考慮一定會存在一個分界點,使得在那個分界點剩余的消費券等於\(0\),后面的都不等於\(0\),那么我們就可以直接維護,且可以發現最優的后綴一定在這個點后面,否則無法全部使用消費券,我們考慮如何找出這個點
- 我們不妨將\(b_i,d_i\)看成括號匹配,那么問題就比較明朗了,我們令\(s_i = s_{i-1} + b_{i-1} - d_i\),那么\(s_i\)嚴格最小(若有多個最小點取最右邊的)的點就是分界點(這個點消費券一定為\(0\),又因為后面的點都比它大,所以都不為\(0\))
- 這個可以用線段樹來維護,在找出這個分界點之后,我們可以直接計算前面使用了多少個消費券(因為為\(0\),所以前面所有產生的消費券都比使用了,即\(d_i\)的前綴和),后面的消費券(因為每次都有盈余,可以直接加加減減),那么我們又可以通過二分來得到\(x\)這個點,注意到\(x\)一定是滿足以下條件最左邊的點.
- 至\(x\)的消費券不夠后面用
- 至\(x+1\)的消費券夠后面用
- 又因為由於\(x\)在分界點之后,消費券還剩多少可以直接計算,線段樹上二分即可
- 時間復雜度\(O((n + q) (\log A + \log n))\)
\(D1T2\)逛街
-
題意簡述:給定長度為 \(n\) 的序列 \(a_i,Q\)次操作。
-
\(1\ l\ r : ∀l ≤ i < r, a_i = max\{a′_i, a′_{i+1}\}\),其中 \(a′_i\) 為未修改前 \(a_i\) 的權
值。 -
\(2\ l\ r:\) 求出 \(∑x∈S\ a_x\),其中 \(S = \{x|l ≤ x ≤ r, ∀l ≤ i < x, a_i < a_x\}\)
-
\(1 ≤ n, Q ≤ 3 × 10^5, 1 ≤ a_i ≤ 10^9, a_i\) 互不相同。
-
考試時想到正解,但沒有調出來
-
不過看到\(zyy\)的\(solution\)后,用另一種樹形結構代替笛卡爾樹確實可以得到比我考試時想到的更簡單的做法
\(solution\)
- 我們考慮這么一個樹形結構,每個點向后面第一個比它大的點連邊
- 那么詢問就是樹上某條直上直下的鏈的權值和
- 我們考慮在若干次修改后,\(a'_i = max\{a_i,a_{i+1}.....a_{b_i}\}\)
- 我們不妨令\(c_i = max\{a_{b_{i-1} + 1}....a_{b_i}\}\),那么答案可以改寫為從開頭是\(x = \max\{a_i....a_{b_i}\},\)從\(c_l\)開始到\(c_r\)的答案
- 那么每次修改,可以理解為把\(b_l\)刪去,然后往\(b_r\)后面拷貝一份\(b_r\).
- 我們可以這樣考慮,每次修改可以理解為所有元素都向左平移一位,因為如果其為前綴最大值,一定可以被前面某個值取\(max\),否則,其一定不會被答案選中(前面有一個值嚴格比他大),但是修改的首項不滿足上面論述,所以首項要和此項取\(max\),刪掉其中一項,詢問的首項也不滿足上面論述,所以要取\(x = \max\{a_i....a_{b_i}\}\)
- 我們可以考慮用平衡樹(\(set\))維護\(b\)和\(c\)序列,注意到上述修改都不會改變樹的結構,然后對應的在樹上單點修改和鏈和查詢即可