ABC467G Many Sweets Problem
ABC467 G|动态区间内最少选取个数
当前状态
暂不补代码,生命周期为 shelved。
这道题的贪心部分不难,真正的门槛是动态二维数据结构。目前已经理解核心查询逻辑,但前置知识和实现能力还不完整,等系统学习相关结构后再回来补题。
核心转化
对于一次询问,在区间 中选择尽量少的元素,使元素和至少为 。
显然应该按照数值从大到小选择。
设区间元素降序排列为
则答案是最小的 ,满足
因此需要动态维护:
-
单点修改 ;
-
查询区间 内较大元素的数量与总和;
-
找到使前若干大元素之和首次达到 的临界权值。
查询思路
可以在值域结构上从大到小下降。
对于当前值域节点,先查询较大值一侧在位置区间 中的:
-
元素总和 ;
-
元素数量 。
若
说明答案完全位于较大值一侧,继续向该侧下降。
否则,较大值一侧的元素必须全部选择:
然后进入较小值一侧。
到达叶子后,设当前权值为 ,还需要选择
个元素。
数据结构方向
官方题解主要有两种方向:
-
交换位置与权值后的动态归并树
外层按权值建立线段树,每个节点内部维护位置维度的数据结构,例如 BIT。
也可以理解为:
值域线段树套位置树状数组。
查询时在值域线段树上贪心下降,复杂度约为
-
二维根号分治
同时对位置和值域分块,按照权值块从大到小扫描。
复杂度约为
当前缺少的前置知识
-
归并树及其动态修改;
-
线段树套树状数组;
-
节点内部坐标离散化;
-
二维分块;
-
Wavelet Matrix 的基本思想;
-
动态区间第 大及前 大元素和。
回补条件
掌握以下任意一个方向后再回来补题:
-
能独立实现动态归并树;
-
能实现值域线段树套位置 BIT;
-
系统学习二维根号分治;
-
掌握支持修改的 Wavelet Matrix。
当前收获
这道题已经识别出两个关键点:
-
最优选择一定是区间内最大的若干个元素;
-
查询可以转化为值域上的贪心下降,而不是普通地二分答案。
暂时停止在“理解模型与官方方案”的阶段,不继续投入代码实现成本。
当前生命周期
- 生命周期:shelved。
- 缺失前置:动态区间第 k 大、动态区间前 k 大和,以及值域结构与位置结构的组合。
- 回补条件:至少独立掌握一种支持修改的区间第 k 大或前 k 大和结构。
- 未来方向:动态二维顺序统计。
ABC467G Many Sweets Problem
http://miqiu.space/posts/5c3aa9e/