問題描述
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 2view code#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 }
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小數。...