1. 程式人生 > >牛客網9.16模擬賽t1方差

牛客網9.16模擬賽t1方差

這題本不想寫題解的,因為是極水的一道公式題 題目連結:方差

題目:

題意 一個長度為 m 的序列 b[1…m] ,我們定義它的方差為 ,其中 表示序列的平均值。 可以證明的是,如果序列元素均為整數,那麼方差乘以 m^2 之後,得到的值一定是整數。

現在有一個長度為 N 的序列 a[1…N],對每個 i = 1~N,你需要計算,如果我們刪除 a[i],剩下的 N-1 個元素的方差乘以 (N-1)^2 的值。

輸入描述: 第一行一個整數 N。 接下來一行 N 個整數,第 i 個數表示 a[i]。 輸出描述: 一行 N 個整數,第 i 個數表示刪掉 a[i] 後,剩下元素的方差乘以 (N-1)^2 的值。

題解:

j=1naj記為s,j=1naj2記為q 去掉a[k]的方差乘以(n-1)^2的值可表示為 i=1n(ai(m1)s+ak)2(akms)2n1 展開化簡得 (n1)qs2+2bksnbk2 s,q預處理出來,每個詢問都是O(1),總時間複雜度O(n),空間O(n)

程式碼:

#include <iostream>
#include <stdio.h>
using
namespace std; const int N=1e5+5; long long n,Ab,ASb,ai[N],bi[N]; long long cal(int k){ return (n-1ll)*ASb-Ab*Ab+2ll*bi[k]*Ab-n*bi[k]*bi[k]; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>bi[i]; Ab+=bi[i]; ASb+=bi[i]*bi[i]; } cout
<<cal(1); for(int k=2;k<=n;k++) cout<<" "<<cal(k); cout<<endl; return 0; }