bzoj 5091 摘蘋果 期望 亂搞

2021-08-13 05:54:04 字數 1228 閱讀 6793

小q的工作是採摘花園裡的蘋果。在花園中有n棵蘋果樹以及m條雙向道路,蘋果樹編號依次為1到n,每條道路的兩

端連線著兩棵不同的蘋果樹。假設第i棵蘋果樹連線著d_i條道路。小q將會按照以下方式去採摘蘋果:

1.小q隨機移動到一棵蘋果樹下,移動到第i棵蘋果樹下的概率為d_i/(2m),但不在此採摘。

2.等概率隨機選擇一條與當前蘋果樹相連的一條道路,移動到另一棵蘋果樹下。

3.假設當前位於第i棵蘋果樹下,則他會採摘a_i個蘋果,多次經過同一棵蘋果樹下會重複採摘。

4.重複第2和3步k次。

請寫乙個程式幫助計算小q期望摘到多少蘋果。

n,k<=100000,m<=200000

比賽的時候只想著如何優化暴力遞推,就沒有搞出來。

這題要注意到題目給出的特殊條件:移動到第i棵蘋果樹的概率是di

2m,假設有一條i到j的邊,那麼在第一步到達j的概率就要加上12

m 。因為要加dj

次,所以第1步到達j的概率就是dj

2m。同理可以得到每一步到達點j的概率其實就是dj

2m。

所以答案就是k∗

∑ni=

1di∗

ai2m

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int n=100005;

const int mod=1000000007;

int n,m,k,a[n],d[n];

intread()

while (ch>='0'&&ch<='9')

return

x*f;

}int ksm(int

x,int

y) return ans;

}int main()

int ans=0,ny=ksm(m

*2,mod-2);

for (int i=1;i<=n;i++) ans+=(ll)d[i]*ny

%mod

*a[i]%mod,ans-=ans>=mod?mod:0;

ans=(ll)ans*k

%mod;

printf("%d",ans);

return

0;}

hdu5091(掃瞄線 線段樹)

題意 給n個點,和長w寬h的矩形,問矩形最多能包含多少個點。思路 掃瞄線 線段樹,首先將座標轉化成非負數,對於每個點 x,y 標記為1,生成乙個 x w,y 的點,標記為 1,然後將y軸建立線段樹,維護乙個最大值即可。如不不明白的話,畫個圖,理解一下就好了。如下 include include in...

HDU 5091 線段樹掃瞄線

給出n個點。和乙個w h的矩形 給出n個點的座標,求該矩形最多能夠覆蓋多少個點 對每乙個點point x。y 右邊生成相應的點 x w,y 值為 1 縱向建立線段樹,從左到右掃瞄線掃一遍。遇到點則用該點的權值更新區間 y,y h include stdio.h include string.h in...

P5091 模板 尤拉定理

出題人也想寫有趣的題面,可惜並沒有能力。給你三個正整數,a,m,ba,m,b,你需要求 a b bmod mabmodm 一行三個整數,a,m,ba,m,b 乙個整數表示答案 輸入 1複製 2 7 4 輸出 1複製 2 輸入 2複製 998244353 12345 98765472103312450...