竟然用到了數學課本上的知識
真心好題
首先,(算術)平均數 a¯
=∑ni
=1ai
n 方差的兩個最基本的形式 s2
=∑ni
=1(a
¯−ai
)2n=
∑ni=
1a2i
n−(∑
ni=1
ai)2
n2這道題這麼明顯的區間操作,顯然容易想到線段樹。
操作1和2都好說,但是維護方差真的好屎啊(而且還不會)。
只需要在原來的區間和以及lazy tag的基礎上再多維護乙個區間平方和(∑n
i=1a
2i)就行了。
操作2就不說了,顯而易見怎麼做。
操作3也很簡單,先求出區間和以及平方和,按式子搞就行了。
操作1就考慮怎麼下放tag。
區間和就不說了。
假設區間[l
,r] 增加
k 。那麼其實就是變成 ==
∑i=l
r(ai
+k)2
∑i=l
r(a2
i+2×
k×ai
+k2)
∑i=l
ra2i
+2k×
∑i=l
rai+
(r−l
+1)×
k2然後隨便搞搞就行了。
#include
using
namespace
std ;
const
int maxn = 1e5+5, maxm = maxn<<2 ;
bool read ( int &x, char c = getchar(), bool flag = false )
int n, m ;
double tree[maxm][2], tag[maxm] ;
// tree[0] = \sum a_i tree[1] = \sum
void push_up ( int h )
void push_down ( int h, int len )
}void create ( int h, int l, int r )
int mid = l+r>>1 ;
create ( h<<1, l, mid ) ;
create ( h<<1|1, mid+1, r ) ;
push_up(h) ;
}void update ( int h, int l, int r, int x, int y, double k )
int mid = l+r>>1 ;
push_down(h, r-l+1) ;
if ( y <= mid ) update ( h<<1, l, mid, x, y, k ) ;
else
if ( x > mid ) update ( h<<1|1, mid+1, r, x, y, k ) ;
else
push_up(h) ;
}double query ( int h, int l, int r, int x, int y, bool type )
int main() else
if ( c==2 ) printf ( "%.4lf\n", (double)query(1,1,n,x,y,0)/(y-x+1) ) ;
else
}return
0 ;}
洛谷 1471 方差
題解 1,本題要求維護乙個序列,支援區間加k,詢問區間平均數和方差。3,方差的處理就相對麻煩一些。需要研究一下公式。我們先看看方差的公式 那就是1 n乘上這個式子 也就是區間平方和sqr 區間和sum的兩倍 平均數 e的平方乘區間長len,所得結果再除以區間長len 4,在區間修改的時候,怎麼維護s...
洛谷 P1471 方差
題目背景 滾粗了的hansbug在收拾舊數學書,然而他發現了什麼奇妙的東西。題目描述 蒟蒻hansbug在一本數學書裡面發現了乙個神奇的數列,包含n個實數。他想算算這個數列的平均數和方差。輸入輸出格式 輸入格式 第一行包含兩個正整數n m,分別表示數列中實數的個數和操作的個數。第二行包含n個實數,其...
洛谷P1471 方差
題目描述 蒟蒻hansbug在一本數學書裡面發現了乙個神奇的數列,包含 n 個實數。他想算算這個數列的平均數和方差。輸入輸出格式 輸入格式 第一行包含兩個正整數 n m 分別表示數列中實數的個數和操作的個數。第二行包含 n 個實數,其中第 i 個實數表示數列的第 i 項。接下來m行,每行為一條操作,...