- 复盘:想到了前缀和 没想到差分数组 直接暴力模拟导致TLE了
- 正确思路:先用前缀和构造区间和 然后遍历所有区间区间和符合完全平方数就用差分数组记录,最后访问差分数组求一次和就得到答案;
- check函数是为了检查完全平方数
cpp
bool check(int a){
//加个0.5是为了处理精度 使得结果更准确 可当模板记住
int b=sqrt(a+0.5);
return b*b==a;
}
accode
cpp
#include<bits/stdc++.h>
using namespace std;
bool check(int a){
int b=sqrt(a+0.5);
return b*b==a;
}
int n,q;
const int N=1e3+5;
int num[N],cha[N];
void solve(){
cin>>n>>q;
num[0]=0;
for(int i=1;i<=n;i++){
cin>>num[i];
num[i]=num[i]+num[i-1];//前缀和
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int temp=num[j]-num[i-1];//细节i-1
if(check(temp)){
cha[i]++;//差分数组
cha[j+1]--;
}
}
}
while(q--){
int qq;cin>>qq;
int res=0;
for(int i=1;i<=qq;i++) res+=cha[i];
cout<<res<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}