分类 解题报告 下的文章

BZOJ 4066 简单题(K-D Tree)解题报告


解题思路

本题是要求实现对点更新和矩形区域的查询操作,强制在线。于是很容易和 K-D Tree 的按区域管辖和合并的性质联系到一起。本题需要对在矩形内外的判断细心留意,以免出错。

另外由于本题大量的插入操作,K-D Tree 可能随着数据量增大导致结构不平衡,从而影响效率。因此这里我们需要用到类似替罪羊树的思想,引入一个平衡因子(这里我设置了 0.7),一旦某一侧子树的 size 过大(所占比例超过平衡因子规定的临界值),就重建这颗树,以此来保证效率。当然直接按插入次数暴力重建整棵树也是可以的。


HDU 5992 Finding Hotels(K-D Tree)解题报告


解题思路

2016 ICPC 青岛 的一道金牌题,是 K-D Tree 的典型应用。

我们可以按 x, y, c 建立三维 K-D Tree,查询的时候如果 c 过大,则直接把当前搜到的 dis 设置为 INF,其他操作和普通 K-D Tree 基本一致。

另外应注意,如果直接使用输入时的数组 Build,可能会被 nth_element() 打乱顺序,因此更新答案时需要记录原数组中的下标信息。


Codeforces 869E The Untended Antiquity(二维树状数组)解题报告


解题思路

很巧妙的一道题。我们可以考虑用二维树状数组去做,新建障碍视为在二位数组中对一个矩形区域增加一个值,而移除障碍就是减掉这个值,查询就是判断两个点的值是否一致。

那么问题来了,这个值要加多少呢?这个题给了很巧妙的做法,就是每次随机一个数(可以去 Editorial 看一下证明)。当然其他不会导致重复的生成方式也是可以的。


SPOJ DQUERY D-query(主席树)解题报告


解题思路

本题是要求区间内不同数的个数,这是主席树的常见应用之一了。

做法很简单,我们可以倒序(从右向左)建立主席树,如果一个值还没出现过,则直接插入,否则删除后再重新插入(相当于保留这个数最左出现的位置)。之后要查询 [l, r] 时,选用 l 位置的主席树,这时树中的数据是 [l, n] 范围内的,因此查询时需要传入 r 作为挡板,仅统计小于等于 r 的个数,这样就可以实现 [l, r] 区间不同数的查询。

当然也可以保留每个数最右出现的位置来正序建树,和上面的做法就反过来了。