Nacon成立新米蘭工作室 或正開發《終結者》生存新作
有 \(n\) 種 T 恤,每種有價格 \(c_i\) 和品質 \(q_i\)。
有 \(m\) 個人要買 T 恤,第 \(i\) 個人有 \(v_i\) 元,每人每次都會買一件能買得起的 \(q_i\) 最大的 T 恤。一個人只能買一種 T 恤一件,所有人之間都是獨立的。
問最後每個人買了多少件 T 恤?如果有多個 \(q_i\) 最大的 T 恤,會從價格低的開始買。
\(n \le 2\times 10^5, c_i , q_i \le 10^9, m \le 2\times 10^5\)。
資料結構
平衡樹
勢能分析
好不容易寫出的鬼畜做法,就被 #55 的 HACK 資料叉掉了。
鬼畜做法
感覺可能是空間太大了。
從小到大考慮物品,然後維護一個分段函式 \(f(x)\) 表示當前有 \(x\) 元,那麼最後會有多少件 T 恤,每一個物品都是導致一段字首函式值不動,然後後面的函式就是 \(f(x)\) 的平移後的影象。
然後考慮維護,可以用可持久化 fhq-treap,在平衡樹上面維護區間以及每段區間的答案,每次將該平衡樹分裂,然後用之前的平衡樹快速合併上來,為了減少空間,可以對於每個節點記一個產生該節點的時間戳。
然後是程式碼。
於是被 CF #55 叉掉了。
正經做法
將所有詢問作為值丟到平衡樹中,從大到小考慮物品,對於物品 \(x\),每次都是 \(< c_x\)
因為平衡樹的合併必須是要有序的,於是有問題,接著可以發現,只有 \([c_x, 2c_x)\) 的物品會出現問題,這個可以暴力插入,其他的打個標記然後合併即可。
因為暴力插入的部分每個數每次會 \(/2\),根據勢能分析可知,每個數最多 \(\log\) 次就會沒了,於是複雜度為 \(\mathcal O(n\log n + q\log^2n)\)。
程式碼。