luogu 1471 方差 線段樹區間更新

2021-08-25 05:27:30 字數 1741 閱讀 1291

滾粗了的hansbug在收拾舊數學書,然而他發現了什麼奇妙的東西。

蒟蒻hansbug在一本數學書裡面發現了乙個神奇的數列,包含n個實數。他想算算這個數列的平均數和方差。

輸入格式:

第一行包含兩個正整數n、m,分別表示數列中實數的個數和操作的個數。

第二行包含n個實數,其中第i個實數表示數列的第i項。

接下來m行,每行為一條操作,格式為以下兩種之一:

操作1:1 x y k ,表示將第x到第y項每項加上k,k為一實數。

操作2:2 x y ,表示求出第x到第y項這一子數列的平均數。

操作3:3 x y ,表示求出第x到第y項這一子數列的方差。

輸出格式:

輸出包含若干行,每行為乙個實數,即依次為每一次操作2或操作3所得的結果(所有結果四捨五入保留4位小數)。

輸入樣例#1:複製

5 5

1 5 4 2 3

2 1 4

3 1 5

1 1 1 1

1 2 2 -1

3 1 5

輸出樣例#1:複製

題目分析:將方差公式開啟,維護區間和及區間平方和即可

#include #include #include #define lson l, mid, rt << 1

#define rson mid + 1, r, rt << 1 | 1

using namespace std;

int const max = 1e5 + 5;

int n, m;

double tmp, sum[max << 2], sum2[max << 2], lazy[max << 2];

void pushup(int rt)

void pushdown(int ln, int rn, int rt)

}void build(int l, int r, int rt)

int mid = (l + r) >> 1;

build(lson);

build(rson);

pushup(rt);

}void update(int l, int r, double val, int l, int r, int rt)

int mid = (l + r) >> 1;

pushdown(mid - l + 1, r - mid, rt);

if (l <= mid)

if (mid < r)

pushup(rt);

}double querysum(int tp, int l, int r, int l, int r, int rt)

int mid = (l + r) >> 1;

pushdown(mid - l + 1, r - mid, rt);

double ans = 0;

if (l <= mid)

if (mid < r)

return ans;

}int main() else if (tp == 2) else }}

洛谷 1471 方差

竟然用到了數學課本上的知識 真心好題 首先,算術 平均數 a ni 1ai n 方差的兩個最基本的形式 s2 ni 1 a ai 2n ni 1a2i n ni 1 ai 2 n2這道題這麼明顯的區間操作,顯然容易想到線段樹。操作1和2都好說,但是維護方差真的好屎啊 而且還不會 只需要在原來的區間和...

洛谷 1471 方差

題解 1,本題要求維護乙個序列,支援區間加k,詢問區間平均數和方差。3,方差的處理就相對麻煩一些。需要研究一下公式。我們先看看方差的公式 那就是1 n乘上這個式子 也就是區間平方和sqr 區間和sum的兩倍 平均數 e的平方乘區間長len,所得結果再除以區間長len 4,在區間修改的時候,怎麼維護s...

P1471 方差 線段樹 數學公式推導

給定乙個長度為n的01序列,下標從0開始,需要實現如下五種操作.這就是一道數學推公式 線段樹維護區間 的典型例題 在我判斷浮點數是否為0的時候大意了啊,寫了1e 5,結果wa了半天.include define rep i,n for int i 1 i n i using namespace st...