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\) 即可。

因为值域过大,所以接下来有两种方式进行实现:

  • 离散化。

  • 用哈希去重。

第二种常数较大,需大力卡常,推荐使用第一种。

posted @ 2023-06-06 18:19  Pwtking  阅读(25)  评论(0)    收藏  举报