CF1421C. Palindromifier


思路:
题目要求添加最少的数使得数组里所有的连续子序列和不为0,对所有子序列的和,考虑前缀和,从前往后枚举前缀和(这里不先预处理所有,枚举一个加一个,后有解释),先标记这个和,如果后面又出现了这个和,说明两者之间的和为0(这个思想老是忘记,好烦),这时候我们需要在这两个数之间添加一个数使其不为0,这个数题目中说是任意大,所以我们可以不用管,记录数量+1即可。之后需要将sum重新置为a[i](因为前面加了一个数导致前缀和变化了)记录容器清空,重新开始计算,完整循环完后即可。
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10, mod = 1e9 + 7;
int n;
int a[N];
void solve()
{
cin >> n;
map<ll, int> mp;
for (int i = 1; i <= n; i ++)
{
cin >> a[i];
}
ll sum = 0;
ll cnt = 0;
mp[0] = 1;
for (int i = 1; i <= n; i ++)
{
sum += a[i];
if(mp.count(sum))
{
cnt ++;
sum = a[i];
mp.clear();
mp[0] = 1;
mp[sum] = 1;
}
else
mp[sum] ++;
}
cout << cnt << endl;
}
int main()
{
ios::sync_with_stdio(0);
//int T;
//cin >> T;
//while(T --)
//{
solve();
//}
return 0;
}

浙公网安备 33010602011771号