(CF1333C)Eugene and an array
思路:
首先,若 \([a_i,\cdots,a_j]\) 是好数组,则 \([a_i,\cdots,a_{j-1}]\) 也是好数组;若 \([a_i,\cdots,a_j]\) 不是好数组,则 \([a_i,\cdots,a_{j+1}]\) 也不是好数组.
则对于每个 \(i\), 可以找到一个最大值 \(r_i\), 使得 \([a_i,\cdots,a_{r_i}]\) 是好数组,以 \(a_i\) 为起点的好数组便有 \(r_i-i+1\) 个.
同时由如上性质,\(r_i\) 是个连续不下降序列. 则可由尺取法求 \(r_i\).
令 \(sum_i = \sum\limits_{j=1}^{i} a_i\), 即前缀和 , 若 \(sum_{i-1}=sum_j\), 则数组 \([a_i,\cdots,a_j]\) 和为 0. 反之,若 \([a_i,\cdots,a_j]\) 为好数组,则 \([sum_{i-1},\cdots,sum_{j}]\) 互不相同. 利用此性质可求 \(r_i\).
用 set 实现时间复杂度为 \(O(nlogn)\)
代码:
1 |
|