题目链接:https://codeforces.com/contest/1748/problem/C
思路:1.根据原理和观察结果,猜测0与和为0的子序列对结果有影响
2.从特殊到一般,进行证明:0必会提供1分;两个0中间,和为0的序列也会提供1分
3.考虑如何实现:用前缀和记录,前缀和相同说明有一段和为0序列;取出现次数最多的前缀和加分;每次遇到0就重置
4.细节处理:1.开long long2.开头没遇到0,前缀和相同不行,得要前缀和为0才行
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
ll n;cin>>n;
ll sum=0;
map<ll ,ll >q;
q.clear();
ll max1=1,shu=0;
q[0]=1;
int ok=1;
for(ll i=1;i<=n;i++)
{
ll a;cin>>a;
if(a==0)
{ ok=0;
shu++;
max1=1;
sum=0;
q.clear();
q[0]=1;
continue;
}
sum+=a;q[sum]++;
if(q[sum]>=2)
{ if(sum==0||ok==0)
{if(q[sum]>max1)
{
max1=q[sum];shu++;
}
}
}
}
cout<<shu<<endl;
}
int main()
{
int t;cin>>t;
while(t--)
solve();
}