洛谷 1471 方差

2021-08-07 07:50:34 字數 1752 閱讀 1828

竟然用到了數學課本上的知識

真心好題

首先,(算術)平均數 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行,每行為一條操作,...