https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ff43/00000000003381cb
由于最大和只有可能是1e7,那么只要枚举到1e3.5的平方,然后对于每一个sum[i]找前面的sum[j]的数量使得sum[i]-sum[j]是这个平方。
这题一开始用unordered_mapT了,然后换成数组作桶就过了。。。不是说好的unordered_map 操作O(1)吗。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
const int up=1e4;
const int maxm=1e7;
int n,m,cas,k;
int a[maxl],b[maxl],sum[maxl];
int num[2*maxm+10];
char s[maxl];
bool in[maxl];
ll ans=0;
inline void prework()
{
scanf("%d",&n);
for(register int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
}
inline void mainwork()
{
ans=0;
int mi=0;
num[0+maxm]++;
for(register int i=1;i<=n;++i)
{
for(register int j=0;j<=up;++j)
{
if(j*j>sum[i]-mi)
break;
ans+=num[sum[i]+maxm-j*j];
}
mi=min(mi,sum[i]);
num[sum[i]+maxm]++;
}
}
inline void print()
{
printf("Case #%d: ",cas);
printf("%lld\n",ans);
for(register int i=0;i<=n;++i)
num[sum[i]+maxm]=0;
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}