HEOI2015 bzoj4031 小z的房間

2021-07-28 03:09:49 字數 1859 閱讀 7135

description

你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含n*m個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。

你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子(以及柱子旁邊的牆)。同時,你不希望在房子中有小偷的時候會很難抓,所以你希望任意兩個房間之間都只有一條通路。現在,你希望統計一共有多少種可行的方案。

input

第一行兩個數分別表示n和m。 接下來n行,每行m個字元,每個字元都會是』.』或者』』,其中』.』代表房間,』』代表柱子。 output

一行乙個整數,表示合法的方案數 mod 10^9

矩陣樹定理。

因為不能求逆元,消元的時候需要兩行輾轉相除。

#include

#include

#include

using namespace std;

const int mod=1000000000;

#define ll long long

ll m[110][110];

char mp[15][15];

int nn,mm,xx=,yy=,id[15][15],n;

bool ok(int

x,int

y)int main()

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

for (int j=1;j<=mm;j++)

if (mp[i][j]=='.')

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

if (ok(x1=i+xx[k],y1=j+yy[k]))

n--;

for (int i=0;i1;

for (int j=i;jif (m[j][i])

if (p==-1) continue;

if (p!=i)

for (int j=i+1;jwhile (m[j][i])

}ans=1;

for (int i=0;i*m[i][i]%mod;

ans=(ans*flag+mod)%mod;

printf("%lld\n",ans);

}#include

#include

#include

using namespace std;

const int mod=1000000000;

#define ll long long

ll m[110][110];

char mp[15][15];

int nn,mm,xx=,yy=,id[15][15],n;

bool ok(int

x,int

y)int main()

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

for (int j=1;j<=mm;j++)

if (mp[i][j]=='.')

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

if (ok(x1=i+xx[k],y1=j+yy[k]))

n--;

for (int i=0;i1;

for (int j=i;jif (m[j][i])

if (p==-1) continue;

if (p!=i)

for (int j=i+1;jwhile (m[j][i])

}ans=1;

for (int i=0;i*m[i][i]%mod;

ans=(ans*flag+mod)%mod;

printf("%lld\n",ans);

}

bzoj4032 HEOI2015 最短不公共子串

字尾自動機 序列自動機 序列自動機這東西好像很高階的樣子。其實很簡單的啦。詳細可以看一下我的部落格序列自動機 對字串a構建字尾自動機 str a 和序列自動機 seq a 類似地,對字串b也構建字尾自動機 str b 和序列自動機 seq b 然後對於4個詢問我們分別拿出1個自動機,如第乙個詢問拿出...

bzoj4027 heoi2015 兔子與櫻花

time limit 10 sec memory limit 256 mb submit 360 solved 187 submit status discuss 很久很久之前,森林裡住著一群兔子。有一天,兔子們突然決定要去看櫻花。兔子們所在森林裡的櫻花樹很特殊。櫻花樹由n個樹枝分叉點組成,編號從0...

BZOJ4027 HEOI2015 兔子與櫻花

bzoj4027 一開始想的都是二維的dp 資料這麼大怎麼轉移啊qa q 後來發現原來貪心就行辣。直接記ans i so ni c i 那麼將這個點刪除對應著其父節點 ansi 1那麼對於某個點 x 將兒子的an s值從小到大排徐,然後依次刪直到不能刪為止。然後刪下面的比刪上面的優。因為刪某個點 x...