1.3 前缀和与差分

激光炸弹

算法:前缀和。

这里假设读者已经学会了二维前缀和,并且其推导是相对简单的,这里直接给出这道题的做法:

我们考虑地图最大只有 \(5001\times 5001\),所以在 \(r\) 大于 \(5001\) 时大于的那部分是无意义的。

我们记录每个位置的宝藏数量,然后做一个前缀和,接着用前缀和 \(O(1)\) 计算出每个 \(r\times r\) 的矩形的贡献,取最大值即可。

增减序列

算法:差分。

我们考虑对原序列做出差分序列 \(b_i\)。那么,我们就是需要把 \(b_2\sim b_n\) 都变成 \(0\)

那么每次操作是什么呢,选择一个差分数组加一,再选择一个减一。也就是说,我们看差分序列的绝对值,把值为正的的绝对值之和设为 \(p\),值为非正的的绝对值之和设为 \(q\)。这样我们第一问的答案就是 \(\max(p,q)\)

其实,这里就是我们先把正的和负的进行消除,剩下的部分与没有影响的 \(b_1,b_{n+1}\) 相消。

下面设 \(c=\operatorname{abs}(p-q)\)

接下来考虑第二问,根据上文所述,最后会剩下 \(\operatorname{abs}(p-q)\) 的值要跟 \(b_1\) 或者 \(b_{n+1}\) 消除,那么对于每个值,我们都可以选择跟哪一个,故对于这两种选择,可能的数量为:\((0,c),(1,c-1),\cdots,(c,0)\),共 \(c+1\) 种方案,故 \(b_1\)\(\operatorname{abs}(p-q)+1\) 种取值。

而根据差分序列的特性,\(b_1\) 在这道题中就是序列最后的值,故可能有 \(\operatorname{abs}(p-q)+1\) 种不同的序列。

最高的牛

我们这里先假设所有给出的 \((a,b)\) 两两不同,再想一想有没有什么好做法。

比较显然地,对于每次给出的 \((a,b)\),我们可以对区间 \([a+1,b-1]\) 内的数减一,这个操作可以用差分简单地维护。

再回到这道题,数对是可能重复的,所以我们判断一下这个数对是否出现过,可以使用 \(map\) 或者哈希。

总结一下,一开始假设所有位置都是最大高度,然后按照上文说的进行区间减一即可。

posted @ 2024-07-11 18:39  zxh923  阅读(1)  评论(0编辑  收藏  举报