Tsinsen A1490 osu 數學期望

2022-06-05 02:45:12 字數 3422 閱讀 1351

問題描述

osu!是乙個基於《押忍!戰鬥!應援團》《精英節拍**》《太鼓達人》等各種**遊戲做成的一款獨特的pc版**遊戲。遊戲中,玩家需要根據**的節奏,通過滑鼠點選或敲擊按鍵合成一首歌曲。

一張osu!的地圖是由若干個「音」排列而成的。在本題中,對於每個音我們只需要考慮成功點選和錯過(miss)這兩種情況。對於一張osu!地圖,玩家的完成情況可以用乙個01串表示(0代表miss,1代表成功)。在本題中,使用如下計分規則:將玩家完成一張地圖的01串中所有的0刪去,則這個串可能會斷裂成若干段連續的1。對於一段長度為l的1(l≥1),你的總分會增加l^2+l+1。例如:一張地圖有10個音,某玩家完成情況為1011101110,則刪除所有0後得到的是「1」「111」和「111」。因此這個玩家的得分為(1+1+1)+(9+3+1)+(9+3+1)=29。

acmonster要給sandytea出一張osu!的地圖。在一張圖中,不同音對於sandytea而言難度可能是不同的。我們定義乙個音的難度係數為sandytea成功完成這個音的概率,因此這個難度係數是介於0和1之間的。

現在acmonster寫下了乙個包含n個音的序列,但是他不想直接把這個序列做成地圖,而是選擇其中的某個片段。設s(x,y)代表序列上第x個音到第y個音構成的序列,acmonster想知道如果把s(x,y)對應的序列做成地圖,sandytea的期望得分是多少。有時acmonster會覺得某個音的難度係數不太合理,因此要進行修改。請你想辦法處理acmonster的修改,並回答他提出的問題。

輸入格式

第一行包含兩個數n和m,n代表序列中音的個數,m代表詢問及修改的總次數。

第二行至第(n+1)行每行包含乙個實數,第i行的實數表示第(i-1)個音的難度係數。

第(n+2)行至第(n+m+1)行每行包含三個數type,x和y。

如果type=0,代表acmonster詢問s(x,y)的期望得分,保證x和y為整數,1≤x≤y≤n。

如果type=1,代表acmonster要把第x個音的難度係數修改為y,保證x為整數,1≤x≤n,0≤y≤1。

輸出格式

對於輸入中所有詢問,按照出現的順序輸出相應的答案,四捨五入保留兩位小數。

樣例輸入

2 30.5

0.50 1 2

1 1 0

0 1 2

樣例輸出

3.25

1.50

樣例說明

對於第一次詢問,00,01,10,11這四種情況出現的概率均為1/4,得分分別為0,3,3,7。因此期望得分為(0+3+3+7)/4=3.25。

對於第二次詢問,00,01這兩種情況出現的概率均為1/2,得分分別為0,3。因此期望得分為(0+3)/2=1.50。

資料規模和約定

20%的資料滿足n,m≤5000;

60%的資料滿足n,m≤50000;

100%的資料滿足n,m≤500000。

題解

我們要求的是e(l^2 + l + 1),我們先按照之前的方法試一試,設sum[i]表示到第i位這個值的答案是e(l^2 + l + 1),那麼我們依舊這樣寫sum[i] = sum[i - 1] + pi * ∆         ∆ = 2e(l) + 2。

但是這樣是不對的,這樣的話我們發現我們把0這樣的∆當成了1。

以下正解:

e(l^2) + e(l) + e(1),應為這些都是得分,sum[i] = sum[i - 1] + pi * ∆。

剩下的就是喬明達大爺的題解了,我就不寫了。

1 #include 2

#define rep(i, a, b) for (int i = a; i <= b; i++)

3#define drep(i, a, b) for (int i = a; i >= b; i--)

4#define rep(i, a, b) for (int i = a; i < b; i++)

5#define mp make_pair

6#define pb push_back

7#define clr(x) memset(x, 0, sizeof(x))

8#define xx first

9#define yy second

10using

namespace

std;

11 typedef long

long

i64;

12 typedef pairpii;

13const

int inf = ~0u >> 1;14

const i64 inf = ~0ull >> 1;15

//*******************************

1617

const

int maxn = 500005;18

19struct

node

24 node(double _p, double _a21, double _a22, double _a31, double _a32, double

_mul1) :

25p(_p), a21(_a21), a22(_a22), a31(_a31), a32(_a32), mul1(_mul1) {}

2627

};28

29double ans0, ans1, ans3[3

];30

31/*

the matrix

32 * =

3334

35*/

3637

double

pi[maxn];

3839

struct

seg_tree

4950

void update(int o, int l, int r, int x, double

p) 55

int mid = l + r >> 1;56

if (x > mid) update(o << 1 | 1, mid + 1

, r, x, p);

57else update(o << 1

, l, mid, x, p);

58push_up(o);59}

6061

void query(int o, int l, int r, int ql, int

qr)

69int mid = l + r >> 1;70

if (ql <= mid) query(o << 1

, l, mid, ql, qr);

71if (qr > mid) query(o << 1 | 1, mid + 1

, r, ql, qr);72}

73} t;

7475

intmain()

88else94}

95return0;

96 }

view code

1490 樹上的路徑

題意 記憶體限制 256 mib 時間限制 1000 ms 給定一棵 n nn 個結點的樹,結點用正整數 1 n 1 n1 n 編號,每條邊有乙個正整數權值。用 d a b d a,b d a,b 表示從結點 a aa 到結點 b bb 路徑上經過邊的權值和,其中要求 a a b 將這 n n 1 ...

1490 樹上的路徑

題意 記憶體限制 256 mib 時間限制 1000 ms 給定一棵 n 個結點的樹,結點用正整數 1 n 編號,每條邊有乙個正整數權值。用 d a,b 表示從結點 a 到結點 b 路徑上經過邊的權值和,其中要求 a n leq 50000 m leq min frac,300000 題解 考慮點分...

tsinsen A1333 矩陣乘法(梁 盾)

a1333.矩陣乘法 梁 盾 時間限制 2.0s 記憶體限制 256.0mb 總提交次數 515ac次數 211平均分 54.14 將本題分享到 檢視未格式化的試題 提交試題討論 試題 2012中國國家集訓隊命題答辯 問題描述 給你乙個n n的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第k小數。...