P10673 【MX-S1-T2】催化剂 题解
首先奇耻大辱。赛时以为 Unrated 就不要紧,帮人调码交了两发,然后棕了。确实该罚,以后牢记。
然后来看题。
先不管操作一二。对于操作三,要求我们把所有糖果分成
如果每人每种糖果先分一颗,这时候每种糖果数量减去
换句话说,我们就是对于每次询问的
这个操作用什么可以完成?平衡树,树状数组,权值线段树都可以做到。赛时无脑上了平衡树,但是实际上因为值域很小,所以后两者不需要离散化就可以。
总的来说,我们的做法就是:用桶维护每种糖果的数量,然后用上面三种数据结构之一维护;加减可以先删再插入,查询就查大于某数的数的和以及数量。
这里是代码。
平衡树有几个点注意:
-
需要加哨兵,否则需要注意边界情况;
-
查大于某数的数的数量,可以找后继然后用根减去左子树。