ABC467G Many Sweets Problem

ABC467 G|动态区间内最少选取个数

当前状态

暂不补代码,生命周期为 shelved。

这道题的贪心部分不难,真正的门槛是动态二维数据结构。目前已经理解核心查询逻辑,但前置知识和实现能力还不完整,等系统学习相关结构后再回来补题。

核心转化

对于一次询问,在区间 [l,r][l,r] 中选择尽量少的元素,使元素和至少为 kk。

显然应该按照数值从大到小选择。

设区间元素降序排列为

v1≥v2≥⋯≥vm,v_1 \ge v_2 \ge \cdots \ge v_m,

则答案是最小的 tt,满足

∑i=1tvi≥k.\sum_{i=1}^{t} v_i \ge k.

因此需要动态维护:

  • 单点修改 Ac←xA_c \leftarrow x;

  • 查询区间 [l,r][l,r] 内较大元素的数量与总和;

  • 找到使前若干大元素之和首次达到 kk 的临界权值。

查询思路

可以在值域结构上从大到小下降。

对于当前值域节点,先查询较大值一侧在位置区间 [l,r][l,r] 中的:

  • 元素总和 sumsum;

  • 元素数量 cntcnt。

若

sum≥k,sum \ge k,

说明答案完全位于较大值一侧,继续向该侧下降。

否则,较大值一侧的元素必须全部选择:

ans+=cnt,ans \mathrel{+}=cnt,

k−=sum,k \mathrel{-}=sum,

然后进入较小值一侧。

到达叶子后,设当前权值为 vv,还需要选择

⌈kv⌉\left\lceil\frac{k}{v}\right\rceil

个元素。

数据结构方向

官方题解主要有两种方向:

  1. 交换位置与权值后的动态归并树

    外层按权值建立线段树,每个节点内部维护位置维度的数据结构,例如 BIT。

    也可以理解为:

    值域线段树套位置树状数组。

    查询时在值域线段树上贪心下降,复杂度约为

    O(log⁡2N).O(\log^2 N).

  2. 二维根号分治

    同时对位置和值域分块,按照权值块从大到小扫描。

    复杂度约为

    O(N).O(\sqrt N).

当前缺少的前置知识

  • 归并树及其动态修改;

  • 线段树套树状数组;

  • 节点内部坐标离散化;

  • 二维分块;

  • Wavelet Matrix 的基本思想;

  • 动态区间第 kk 大及前 kk 大元素和。

回补条件

掌握以下任意一个方向后再回来补题:

  • 能独立实现动态归并树;

  • 能实现值域线段树套位置 BIT;

  • 系统学习二维根号分治;

  • 掌握支持修改的 Wavelet Matrix。

当前收获

这道题已经识别出两个关键点:

  1. 最优选择一定是区间内最大的若干个元素;

  2. 查询可以转化为值域上的贪心下降,而不是普通地二分答案。

暂时停止在“理解模型与官方方案”的阶段,不继续投入代码实现成本。

当前生命周期

  • 生命周期:shelved。
  • 缺失前置:动态区间第 k 大、动态区间前 k 大和,以及值域结构与位置结构的组合。
  • 回补条件:至少独立掌握一种支持修改的区间第 k 大或前 k 大和结构。
  • 未来方向:动态二维顺序统计。

ABC467G Many Sweets Problem
http://miqiu.space/posts/5c3aa9e/
作者
Miqiu
发布于
2026年7月16日
许可协议