直接按公式算肯定会TLE,那么需要找其他办法。
难点是如何不超时计算σ的值。实际上,σ计算式展开以后就是根号下xi的二次方的平均数减去xi平均数的二次方。那么只需要常模的前缀和数组与常模的平方的前缀和数组,那么对于每个询问即可快速算出常模的平均数与其平方的平均数。
1 #include<iostream> 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 using namespace std; 6 int main() 7 { 8 int n, q; 9 scanf("%d%d", &n, &q); 10 vector<int> a(n+1),sum(n+1),sum2(n+1); 11 for (int i = 1; i <= n; ++i) 12 { 13 int A; 14 scanf("%d",&A); 15 a[i] = A; 16 } 17 for (int i = 1; i <= n; ++i) 18 { 19 sum[i] = sum[i - 1] + a[i]; 20 sum2[i] = sum2[i - 1] + a[i] * a[i]; 21 } 22 for (int i = 0; i < q; ++i) 23 { 24 int l, r; 25 scanf("%d%d", &l, &r); 26 double ave = (double)(sum[r] - sum[l - 1]) / (r - l + 1); 27 double ave2= (double)(sum2[r] - sum2[l - 1]) / (r - l + 1); 28 double sigma = sqrt(ave2 - ave*ave); 29 double result = -(double)75 / 70 * sigma + ave; 30 printf("%lf ", result); 31 } 32 }
另外,这里如果用cin,cout而不用printf,scanf则会TLE。(屑开的评测机居然不支持ios::sync_with_stdio(false))