NOI2017 泳池 DP 線性遞推

2021-09-28 14:47:55 字數 2944 閱讀 3679

傳送門

第一步轉換:求恰好為 k 的轉換成 ≤

k\le k

≤k的減去 ≤k−

1\le k-1

≤k−1

的考慮 dpdp

dp,令 fif_

fi​ 表示寬度為 i

ii 的答案

列舉第乙個斷點到i

ii 的長度,fi=

∑j=0

i−1f

i−j−

1∗gj

∗(1−

p)

f_i=\sum_^f_*g_j*(1-p)

fi​=∑j

=0i−

1​fi

−j−1

​∗gj

​∗(1

−p)g

ig_i

gi​ 表示最後一排全部安全,面積 ≤

k\le k

≤k的概率

g

gg 好像不是很好求,考慮加上高度一維,dpi

,j

dp_dp

i,j​

表示底下寬度為i

ii,恰好在 j+1

j+1j+

1 行出現了不安全的概率

那麼 gi=

∑j=1

dpi,

jg_i=\sum_dp_

gi​=∑j

=1​d

pi,j

​考慮 dpdp

dp的轉移

套路:列舉第乙個不安全的位置,它前面不安全的必須全部》

j>j

>

j,後面 ≥

j\ge j

≥jd pi

,j=p

j(1−

p)∑l

=1i∑

x>jd

pl−1

,x∗∑

x≥jd

pi−l

,x

dp_=p^j(1-p)\sum_^ \sum_dp_*\sum_dp_

dpi,j​

=pj(

1−p)

∑l=1

i​∑x

>j​

dpl−

1,x​

∗∑x≥

j​dp

i−l,

x​有用的狀態只有 klo

g(k)

klog(k)

klog(k

) 個,字首和優化轉移

f i=

gi+∑

j=1i

fi−j

gj−1

(1−p

)f_i=g_i+\sum_^if_g_(1-p)

fi​=gi

​+∑j

=1i​

fi−j

​gj−

1​(1

−p)然後發現 j

jj 的下屆其實是 i−k

−1

i-k-1

i−k−

1,然後就可以線性遞推了,k

2k^2

k2暴力乘

複雜度 o(k

2log

(k)+

k2lo

g(n)

)o(k^2log(k)+k^2log(n))

o(k2lo

g(k)

+k2l

og(n

))

#include#define n 1005

using namespace std;

#define cs const

cs int mod = 998244353;

int add(int a, int b)

int mul(int a, int b)

int power(int a, int b)

void add(int &a, int b)

void mul(int &a, int b)

int n, k, x, y, q, pw[n];

int dp[n][n], f[n], g[n];

int p[n], a[n], b[n], tmp[n << 1];

void mul(int *a, int *b, int *c, int k)

for(int i = 0; i < k; i++) c[i] = tmp[i];

}int solve(int k)

}for

(int i = 0; i <= k; i++) g[i + 1] = mul

(dp[i][1], q), f[i] = dp[i][1];

for(int i = 1; i <= k; i++)

for(int j = 1, l = min

(i, k + 1)

; j <= l; j++)

add(f[i], mul

(f[i - j], g[j]));

memset

(p, 0, sizeof

(p))

;memset

(a, 0, sizeof

(a))

;memset

(b, 0, sizeof

(b))

; p[++k] = 1;

for(int i = 0; i < k; i++) p[i] = mod - g[k - i];

a[0] = b[1] = 1;

for(int i = n; i; i >>= 1, mul

(b, b, b, k))if

(i & 1)

mul(a, b, a, k)

; int ans = 0;

for(int i = 0; i < k; i++)

add(ans, mul

(a[i], f[i]));

return ans;

}int main()

NOI2017 蚯蚓排隊

嘟嘟嘟 現在看來這道題還不是特別難。別一看到字串就想sam 看到 k 很小,所以我們可以搞乙個單次修改複雜度跟 k 有關的演算法。能想到,每一次斷開或鏈結,最多隻會影響 k 2 個長度為 k 的區間。所以我們開乙個雜湊表,每一次拼接時就往雜湊表裡加入 k 2 個新的雜湊值,斷鏈的時候就把這些雜湊值減...

NOI2017蚯蚓排隊

原題鏈結 發現 k 50 在插入和刪除時最多會影響不超過 k2 個串,用鍊錶實現插入和刪除,然後只需用雜湊表維護每個長度不超過k的串的出現次數,雜湊的話可以先用比較大的範圍的值處理衝突,再對映到1e8的桶裡統計。考慮複雜度。首先在刪除時由於保證了 c 1000 所以這部分複雜度是o ck2 的。插入...

NOI2017醬油記(偽)

好吧其實是因為菜沒拿到名額才去打同步賽的。day1 拿到題面 1.不存在的 2.tan 90 3.辣雞吉利 臥槽,全是假題。此時skydec在裙上說第三道用dp騙分。於是我就愉快的擼了乙個小時擼出來了。然後一看t2,好像可以雜湊呀 然後就愉快的花了乙個小時碼碼碼 半個小時之後調完了。然後看第一道。還...