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