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;
}
CF