$2016$长城信息杯中国大学生程序设计竞赛中南邀请赛$G$题
前缀和。
把公式化开来,会发现只要求一段区间的和以及一段区间的平方和就可以了。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; const int maxn=100010; int n,m; int a[maxn],sum[maxn],sum2[maxn]; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); sum2[0]=sum[0]=0; for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; sum2[i]=sum2[i-1]+a[i]*a[i]; } for(int i=m;i<=n;i++) { int st=i-m+1,en=i; double avg=1.0*(sum[en]-sum[st-1])/m; double ans=((sum2[en]-sum2[st-1])+m*avg*avg-2*avg*(sum[en]-sum[st-1]))/(m-1); printf("%.8lf ",sqrt(ans)); } } return 0; }