LG12716
观察数据范围,考虑枚举每个区间 \([l,r]\),使用前缀和快速求出区间和并判断是否为完全平方数,若是则对 \(i \in [l,r]\) 都产生 \(1\) 的贡献,使用差分数组维护即可。时间复杂度 \(O(n^2)\)。
#include <iostream>
#include <cstdio>
#include<cmath>
#define int long long
#define N 10010
using namespace std;
int n,a[N],s[N],d[N];
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int k=sqrt(s[j]-s[i-1]);
if(k*k==s[j]-s[i-1]){
d[i]++;d[j+1]--;
}
}
}
for(int i=1;i<=n;i++)
d[i]+=d[i-1],cout<<d[i]<<endl;
return 0;
}

浙公网安备 33010602011771号