加载中...

权值线段树上二分维护动态集合前k大总和(k不是定值) trick

对于一个动态集合(支持插入一个数与删除一个数),想要维护对于任意 \(k\),它的前 \(k\) 大的总和,直接利用权值线段树搭配普通线段树就可做。

具体地,先将所有值离散化,并维护 权值线段树与权值线段树下标相对应的值的区间求和线段树(改成树状数组也行),大致类似这样:

seg1.update(1, pos, 1); // 权值线段树
seg2.update(1, pos, a[p]); // 区间求和线段树

欲求前 \(k\) 大的总和,很显然就是先在权值线段树上二分,找到 最右侧的、后缀和恰好等于 \(k\) 的位置,然后再用普通线段树(或树状数组)查询对于该位置的后缀和,即为所求。前 \(k\) 小同理。

posted @ 2026-04-02 15:26  小橘奏  阅读(17)  评论(0)    收藏  举报