轟炸方案 題解

2022-05-08 17:03:11 字數 2113 閱讀 1951

a國共有 n 個城市,每兩個城市之間均有一條交通線聯通。如今a國遭到 b 國的重創,岌岌可危。b 國國王決定轟炸a國的交通線。

面對危難之時,a國國王決定更換首都。在 b國的轟炸結束之後,a國的領土將會分成若干個聯通 塊。a國的首都,將會從聯通塊大小最大的聯通塊中,隨機選擇乙個城市,作為首都。

b 國有多少種不同的轟炸方案,使得a國首都所在的聯通塊大小恰好為k。兩種轟炸方案是不同 的,當且僅當一條交通線在一種方案中存在,在另一種方案中被轟炸。由於方案數可能很大,你需要輸 出方案數對 998,244,353 取模的結果。

求n個點的圖,最大的連通塊大小恰好為k的數量。點有編號,兩張圖不同當且僅當存在兩點,其中一張圖有邊連線,另一圖無邊。

首先,確定這道題用dp做。題目讓我們求最大的連通塊恰好為k,考慮我們通常的dp過程,由於一張圖可能有多個連通塊,若要限定某乙個塊恰好為k並不好處理,但是限定所有的塊小於等於k是比較好做到的。於是,這裡需要用到乙個技巧:設\(g_k[n]\)表示n個點的圖,最大的連通塊小於等於k,那麼我們分別把小於等於k的方案\(g_k[n]\)和小於等於k-1的方案\(g_[n]\)算出來,用前者減去後者即可得到答案。

問題轉化:求n個點的圖,最大的連通塊小於等於k個的數量。

再次簡化問題,考慮n=k時怎麼做。實質上就是沒有了k的限制,求n個點的連通圖的數量\(f[n]\)。理性思考億下,發現好像並不能直接通過之前算過的f來推出現在的f。如果是\(o(n)\)遞推,假設新來了乙個點i,不論之前的點是否連通,似乎都有連法使它們連通;如果是\(o(n^2)\)遞推,用\(f[m]\)和\(f[n-m]\)去推\(f[n]\)好像會算重......

那能不能用總方案減去不連通圖的數量呢?總方案\(h[n]\)用\(c_n^2\)條邊是否選擇來算,那麼考慮如何計算不連通圖的數量。只要一張圖有兩個以上的連通塊就不連通了,於是我們考慮列舉乙個連通塊大小為j,而剩下的i-j個點沒有限制,嘗試寫出遞推式:

\[f[i]=h[i]-\sum_^ c_i^jf[j]h[i-j]

\]再次理性思考億下,好像不太對。

為了體現出點有編號,我們在裡面加了乙個組合數\(c_i^j\),表示在i個點裡面拿j個點出來連通。但注意到另一邊i-j個點是沒有限制的,可能就在其中,有乙個連通塊s大小也為j,當前面的組合數中也列舉到這j個點的時候,就算重了。於是,我們得想個辦法,讓左邊和右邊不會有同乙個連通塊。

如果能讓我們通過組合數枚舉出來的連通塊比較「特殊」就好了。對於當前的圖的乙個點p,我們只列舉包含p的連通塊。也就是說,我們要在i個點裡面拿j個點出來連通,先拿乙個點p出來,再從i-1個點裡選j-1個點與p連通。因為列舉的連通塊一定包含p,所以剩下的i-j個點不可能有包含p的連通塊,也就不會算重了。

真正的遞推式:

\[f[i]=h[i]-\sum_^ c_^f[j]h[i-j]

\]有了上面的鋪墊,\(g_k[i]\)也就很好求了:

\[g_k[i]=\sum_^ c_^f[j]g_k[i-j]

\]這裡的分析與f的遞推式大同小異,就不再贅述了。

這道題還是算比較難的計數dp,主要是要善於對問題進行轉化,這道題運用的許多技巧也比較常見,但是我看題解都看了1個多小時......還是得多積累經驗啊!

#include #define i inline

#define r register int

#define ll unsigned long long

using namespace std;

const ll p=998244353,n=2003;

ll f[n],h[n],g[n],_g[n],c[n][n];

i void pls(ll &a,ll b)

int main()

} _g[0]=g[0]=h[0]=1;

register ll w=1;

for(r i=1;i<=n;i++)

for(r i=1;i<=n;i++)

for(r i=1;i<=n;i++)

for(r j=1;j<=i&&j<=k;j++)

pls(g[n],p-_g[n]);

printf("%llu",g[n]);

}

noip模擬賽 轟炸

c國和w國爆發了戰爭!yjc決定對w國的n個城市進行轟炸。每個城市都有乙個重要度ai。設xi 重要度大於ai的城市數 1 那麼編號為i城市就是第xi個被轟炸的城市。顯然這樣能保證重要度大的城市先被轟炸,重要度相同的城市同時被轟炸。現在yjc想知道,對於每乙個i,xi等於多少?輸入格式 第一行包含乙個...

LeetCode Python 361 轟炸敵人

給你乙個二維的網格圖,網格圖中的每乙個格仔裡要麼是一堵牆 w 要麼是乙個敵人 e 要麼是乙個空位 0 數字 0 返回你用乙個炸彈最多能殺死敵人的數量。由於牆體足夠堅硬,炸彈的威懾力沒有辦法穿越牆體,所以炸彈只能把所在位置同一行和同一列所有沒被牆擋住的敵人給炸死。注意 你只能把炸彈放在乙個空的格仔裡 ...

簡訊轟炸機製作

昨天跟nosafe小組的 asey1k見了個面,互相交流了一下午的技術。他演示了利用某個b2b 的簡訊驗證碼漏洞,實現任意使用者密碼重置。並且可以強制任意改註冊手機號。我也是受到啟發 給大家講乙個小小的案例吧。這個案例他當時給我演示過,就是 利用某 註冊簡訊驗證碼漏洞,抓包改包實現簡訊轟炸騷擾 我回...