一个连续子序列(片段)可以由其起始位置 i 和结束位置 j 定义(其中 1≤i≤j≤n)。 根据题意,一个从索引 i 到 j 的片段是“平衡片段”的条件是: ∑k=ijAk=j−i+1 这里的 ∑k=ijAk 是片段中所有水晶的能量和,而 j−i+1 是该片段的长度。
直接暴力枚举所有的起始位置 i 和结束位置 j,然后计算和并判断,时间复杂度会达到 O(n2),对于 n=2×105 的数据规模来说太慢了,会超时。我们需要一个更高效的算法。
我们可以对这个条件进行数学变换。等式右边的长度 j−i+1 可以看作是 j−i+1 个 1 相加的结果。
多多最近来到了一片神秘的山谷,山谷中散落着一些能量水晶。每一颗水晶拥有一个整数能量值,可能为正,也可能为负。
水晶被排成一条直线,多多决定在其中选择一个连续的水晶序列进行采集。为了保证能量的平衡,他只愿意采集“平衡片段"——即片段中所有水晶的能量值加起来,恰好等于这个片段中水晶的数量。
请你帮多多计算一下,在这条水晶链中,总共有多少个这样的“平衡片段”。
第一行包括一个整数 n(1≤n≤2×105) ,代表山谷中能量水晶的数量。
第二行包括 n 个整数 A1,A2,…,An(−109≤Ai≤109) ,代表第 i 个水晶的能量值。
输出一个整数,表示一共有多少个“平衡片段” 。
输入
3
2 0 1
输出
3
说明
样例中,满足条件的子段共有 3 个:
[1] :能量和为 1 ,长度为 1
[2,0] :能量和为 2 ,长度为 2
[1,2,0] :能量和为 3 ,长度为 3