1. 程式人生 > 遊戲 >Nacon成立新米蘭工作室 或正開發《終結者》生存新作

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

的物品不動,然後 \(\ge c_x\) 的物品直接 \(-c_x\) 然後答案 \(+1\) 之後和前面的 \(<c_x\) 的物品進行合併。

  因為平衡樹的合併必須是要有序的,於是有問題,接著可以發現,只有 \([c_x, 2c_x)\) 的物品會出現問題,這個可以暴力插入,其他的打個標記然後合併即可。

  因為暴力插入的部分每個數每次會 \(/2\),根據勢能分析可知,每個數最多 \(\log\) 次就會沒了,於是複雜度為 \(\mathcal O(n\log n + q\log^2n)\)

  程式碼