如果是正常的我肯定是果断写一个线段树合并 + 线段树上二分,然而今天学了左偏树那就写一写。
(如果对于每个点有单独的 M 左偏树就没法做了)
显然要从小到大选数,直到最后一个能满足总和不超过 M 的,这样一定是最大的。
所以权值线段树上二分吧!
(大雾)
不过左偏树也能做,就是维护子树内的大根堆,然后一直弹直到总和不超过 M 即可。
问题在于如何维护。
由于 M 不变,所以之前被弹掉的之后不可能再有贡献,于是每个点做完之后合并到父亲处即可。
代码:
1 |
|
如果是正常的我肯定是果断写一个线段树合并 + 线段树上二分,然而今天学了左偏树那就写一写。
(如果对于每个点有单独的 M 左偏树就没法做了)
显然要从小到大选数,直到最后一个能满足总和不超过 M 的,这样一定是最大的。
所以权值线段树上二分吧!
(大雾)
不过左偏树也能做,就是维护子树内的大根堆,然后一直弹直到总和不超过 M 即可。
问题在于如何维护。
由于 M 不变,所以之前被弹掉的之后不可能再有贡献,于是每个点做完之后合并到父亲处即可。
代码:
1 | #include <cstdio> |
Related Issues not found
Please contact @Alpha1022 to initialize the comment