CF877F题解
本题的难点在于如何快速判断符合题意的答案。因为题目让我们统计是两种书的和的差,看到这种情况首先想到记录两本书之和差的前缀和 \(sum_{1-n}\)。
每次我们将 \(l\) 移至 \(l-1\) 时,新增加的答案情况便是 \([l,k],k\in [l+1,r]\) 这种情况的答案,也即是 \(sum_k-sum_{l-1}=k\) 的情况,移项得 \(sum_k=k+sum_{l-1}\)。即是求有多少个 \(sum_k\) 等于 \(k+sum_{l-1}\)。\(k\) 和 \(sum_{l-1}\) 是我们在维护时的已知量,那么我们只需处理 \(sum_k\) 的次数即可。
每次我们将 \(r\) 移至 \(r+1\) 时,答案的增加量即是 \([l,k],k \in [l,r)\) 的情况。与刚才 \(l\) 转移时的情况同理,即是求 \(sum_r-k\) 的数量。
综上,我们需要预处理 \(sum\),\(sum-k\),\(sum+k\),同时判断是否有 \(sum-k=sum_i\) 或 \(sum+k=sum_i\) 即可。
因为值域过大,所以接下来有两种方式进行实现:
-
离散化。
-
用哈希去重。
第二种常数较大,需大力卡常,推荐使用第一种。

浙公网安备 33010602011771号