題目
傳送門 to luogu
思路
由於正解講的蠻多了,所以這裏寫幾個騙分做法。
普通想法
f(i)(l≤i≤r) 表示,從 l 出發,始終位於 [l,r] 中,走到 i 的概率。初始化
f(l)=1+fail(i+1)⋅f(l+1)
爲什麼這裏的初始化不是一?同樣的,我們分類討論,如果是直接出現,則爲 1 ;或者是從上面下來。
另一個角度,不將 f 理解爲概率,理解爲
way∑P(way)
其中 way 是一種合法的移動方式,可以是一來就出現於 l 處,或者走着走着回去了。
對於 i∈(l,r) ,明顯只能從上方或下方到來,故
f(i)=win(i−1)⋅f(i−1)+fail(i+1)⋅f(i+1)
試着去解,
fail(i+1)⋅f(i+1)=f(i)−win(i−1)⋅f(i−1)
即
fail(i+2)⋅f(i+2)=f(i+1)−win(i)⋅f(i)
令
f(i)=ai⋅f(i+1)+bi
則
fail(i+2)⋅f(i+2)=f(i+1)−win(i)⋅[ai⋅f(i+1)+bi]
⇔[1−win(i)⋅ai]f(i+1)=fail(i+2)⋅f(i+2)+win(i)⋅bi
顯然 ai+1,bi+1 可知了,即
ai+1=1−win(i)⋅aifail(i+2)
bi+1=1−win(i)⋅aiwin(i)⋅bi
令 fail(r+1)=0 ,顯然可以推廣到 i=r 的情況,於是解出
f(r)=ar⋅f(r+1)+br=br
於是答案就出來鳥。複雜度 O(nq) ,可以過 44pts 。話說 br 的計算沒用到 fail(r+1) ,甚至可以不更改。
簡單想法
就是這道題中的 dp 寫法給了我啓示,直接定義 f(i) 爲,一直在 [l,r+1] 中移動,從 i 走到 i+1 的概率。轉移就很簡單了,一種是走到 i−1 又走回來,一種是直接上去。故
f(i)=fail(i)⋅f(i−1)⋅f(i)+win(i)
這種方程就蠻好解了,直接
f(i)=1−fail(i)⋅f(i−1)win(i)
邊界 f(l−1)=0 ,不可能從 l−1 出發而始終在 [l,r+1] 中。
可是答案比較難看,會是
ans=i=l∏rf(i)
複雜度還是 O(nq) 的,沒有改進,不過好想的多,也不會打錯。然鵝我錯誤的判斷了難度,選擇剛正解,結果爆零了。
正解
一個區間 [l,r] 無非就兩種,從左邊進去,和從右邊進去。
所以我們分別用 f 和 g 來存儲。從哪邊出去?無所謂,反正和爲一。
然後用線段樹求解。f/g(l,r) 都要求一直停在 [l−1,r+1] 內,然後枚舉過中線的狀態。
比如,從左近、從右出,可能經過了中線 2k+1 次,而每兩次的概率是 f(mid+1,r,LEFT)×g(l,mid,RIGHT) ,然後就可以無窮級數直接求出來了。
話說我還以爲是動態dp那種用線段樹維護矩陣呢,糟透了。