题目
- 题意
给你一个数组,不包含 0 0 0 但是要求你插入最少的数(随意大小),使得没有任何一个子数组的和为 0 0 0 。
- 思路
肯定要想到前缀和;自己笨死了,不知道以后咋处理了。也想到要用 m a p map map哈希了,但是忘了消除前缀影响了——意思就是一旦你找到了 p r e [ l ] = = p r e [ r ] pre[l]==pre[r] pre[l]==pre[r] r之前的所有前缀都会失效,因为你可以选择在 l ∼ r l \sim r l∼r 这一段区间,你可以搞掉他,使得他的区间和不为 0 0 0,从而对以后的处理没有影响了。如果不删除影响的话,就会出现大区间包含小区间的情况被重复计算,看样例3
9
-1 1 -1 1 -1 1 1 -1 -1
- 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
vector <ll> v(n);
for(ll &x : v) cin >> x;
int ans = 0; ll cur = 0;
map <ll, int> pre;
pre[0] = 1;
for(int i = 0; i < n; i ++) {
cur += v[i];
if(pre[cur]) {
ans ++;
pre.clear();//清楚前缀影响
cur = v[i];//从这里以后开始重新考虑
pre[0] = 1;
}
pre[cur] = 1;
}
cout << ans;
return 0;
}