GXOI GZOI2019 逼死強迫症

2021-10-01 14:06:16 字數 2048 閱讀 3367

傳送門 to luogu

將道路看成乙個很高很瘦的傢伙(乙個 n×2

n\times 2

n×2 的瘦高個)。

考慮最後一行(或者說,第一行)是什麼情況。用 f(n

)f(n)

f(n)

表示答案。

不好搞定的是第三種情況。下面都只討論第三種情況。如圖。

不妨設第一行的 1×1

1\times 1

1×1 磚塊在右側。最開始,放置方法唯一,如圖(1)

(1)(1

)。下一步,由於某一行有乙個「空洞」,我得將其填補,所以如圖(2)

(2)(2

)。反覆填補,直到遇到另乙個 1×1

1\times 1

1×1 的磚塊才能夠停止。可能是任意一行。如圖(3)

(3)(3

)。這說明,我們只需要唯一確定另一塊 1×1

1\times 1

1×1 的磚塊在哪一行即可。在這兩塊 1×1

1\times 1

1×1 的磚塊之間的方案是唯一的。而剩餘部分(頂上的空白)是簡單情況。

如果用 g(n

)g(n)

g(n)

表示只使用 1×2

1\times 2

1×2 的磚塊填滿 n×2

n\times 2

n×2 的道路的方案數,那麼有遞推式

f (n

)=f(

n−1)

+f(n

−2)+

2∑i=

0n−3

g(i)

f(n)=f(n-1)+f(n-2)+2\sum_^g(i)

f(n)=f

(n−1

)+f(

n−2)

+2i=

0∑n−

3​g(

i)i

ii 的上界是 n−3

n-3n−

3,因為兩個 1×1

1\times 1

1×1 磚塊至少有3

33行(不信看圖(1)

(1)(1

),清晰明了)。還要乘2

22,是因為第一行的 1×1

1\times 1

1×1 磚塊可以在左,也可以在右。

然後問題是g(n

)g(n)

g(n)

怎麼求?然而是一樣的分析方法——g(n

)=g(

n−1)

+g(n

−2)g(n)=g(n-1)+g(n-2)

g(n)=g

(n−1

)+g(

n−2)

我們只需要用乙個矩乘快速冪優化一下即可。複雜度o(q

log⁡n)

\mathcal o(q\log n)

o(qlogn)

(我的常數為4

34^3

43)。

#include

#include

#include

using

namespace std;

inline

intreadint()

const

int mod =

1e9+7;

struct matrix

static matrix i()

matrix operator*(

const matrix &b)

const

void

output()

const};

inline matrix qkpow

(matrix x,

int q)

matrix q, s;

int t;

void

input()

void

solve()

}int

main()

詳 析 GXOI GZOI2019 逼死強迫症

在 2 times n 的方格中用 n 1 塊 2 times 1 的方磚和 2 塊 1 times 1 的方磚填充,且兩塊 1 times 1 的方塊不能有相鄰的邊,求合法方案數。啊,一道計數問題。反正我開始是這樣想的。如果沒有那兩塊很礙事的磚,這不就是斐波拉契遞推嗎?f i f i 1 f i ...

GXOI GZOI2019 舊詞 解題報告

對於一棵 n 個節點的樹,給出 m 次詢問和常數 k 每次給出 r,x 求 sum limits r depth lca i,x k n,m le 5 times 10 4 1 le r,x le n k le 10 9 如果有做過 lnoi2014 lca,就很容易想出解法。可以通過樹上差分,點 ...

題解 GXOI GZOI2019 旅行者

調這個題調了兩個月,被自己蠢哭 給乙個有向圖,一組關鍵點,求關鍵點之間的最短的距離 這個題目有兩種做法,分別是 nlogn 和 nlog 2n 的 首先說 nlogn 的官方做法,我們考慮多源迪傑斯特拉 正圖上從 k 個關鍵點出發跑 dijkstra 記某個點離最近的關鍵點距離為 dis 0 i 反...