(1)与day1的pie题相似,仅用前缀和枚举两个端点会超时,采用同样的思路:固定左端点,所有区间的左端点都是左顶点。枚举右端点,找到两个区间和相等的右端点,两区间右端点相减得到的区间的和即为0。
(2)不同点:
· map的作用不同:pie中map用来统计每种余数出现的个数,本题中map用来记录每种 区间和最靠右的顶点。
· 该题中可以省略掉set,每次循环输入数值,计算前缀和,同时更新map中的对应值。
(3)代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n, a, s, ans;
map<int, int> mp;
int main()
{
cin >> n;
ans = -1;
mp[0] = 0;
for (int i = 1; i <= n; i ++)
{
cin >> a;
s += a;
if (mp.count(s) == 0)
mp[s] = i;
else
ans = max(ans, i - mp[s]);
}
cout << ans;
return 0;
}