滾粗了的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:複製1 5 4 2 3
2 1 4
3 1 5
1 1 1 1
1 2 2 -1
3 1 5
題目分析:將方差公式開啟,維護區間和及區間平方和即可
#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...