WC2017四校聯考3 優美的樹 題解

2021-07-26 05:27:54 字數 1187 閱讀 2011

題目出自尛焱轟

眾所周知,樹是n 個節點n-1 條邊的結構,而所謂的優美的樹需要滿足如下條件:

1. 這是一棵有根二叉樹;

2. 非葉節點需有兩個兒子;

3. 不可以變換為k-左偏樹。

所謂的k-左偏樹是指一棵有k 個葉子的樹,每個非葉節點的右兒子均為葉子且均有左兒子。

所謂的變換指的是經過若干次如下兩種變換:

1. 刪去乙個節點的兩個兒子;

2. 用乙個節點的某個兒子替換該節點。

如下圖,若k=3 則這不是一棵優美的樹。

現在給你k 和n,想要你求出葉子數為1,2,3…n 的優美的樹分別有多少。

n,k<=5000

設 f[i][j] 表示有 n 葉子節點、向左深度最大為 j 的這種形態的樹的數量。

轉移就是列舉兩棵樹合併。

卡下常數好像能70分。

首先去掉那 n+1 個葉子節點,這樣就去掉了每個節點一定要有兩個兒子的限制。(woc我怎麼就想不到)

按先序遍歷的順序來dp。(woc我怎麼就想不到×2)

設 f[i][j] 表示先序遍歷到了第 i 個節點,從 1 到 i 的向左深度為 j,的方案數。轉移就是列舉下乙個點放哪,可以放自己的左兒子,也可以放祖先(包括)的右兒子。

有多少祖先缺右兒子呢?其實,我們向左走了 j 步,就相當於有 j 個祖先缺右兒子。(woc我怎麼就想不到×3)

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

typedef long long ll;

const int maxn=5005;

const ll mo=1e9+9;

int n,k;

ll f[maxn][maxn],g[maxn][maxn];

int main()

printf("1\n");

fo(i,1,n) printf("%lld\n",g[i][1]);

}

WC2017模擬1 2總結

這兩天幾乎都墊底。做這種模擬最大的感覺就是 智商完全不夠用啊 也是,我乙個連進省隊都很危險的菜雞,做這種模擬,智商肯定不夠。幸好這兩場所用的知識點還在我範圍內,不然就更加不可做了。對於我這等小弱雞,wc必須打暴力啊。但是我的暴力能力好像不怎麼好。主要有兩個問題。一是暴力老是打掛。可能是迴圈變數,可能...

WC2017遊記 能力殘廢康復計畫

懶癌晚期的蒟蒻一年多沒有更blog了 這次冬眠營去紹一省好好地遊玩了一番,體驗了一段時間的豪華自助餐,成功吃胖 第一課堂的東西基本還是沒吸收 聽著覺得有點道理,結果過幾分鐘就忘了 可能最大的收穫就是 又 體會到自己太弱了 於是變成了吃飯冬眠旅遊營 順便 松爺真是太強辣 我多年卡常可能卡的是假常數 排...

四校聯考 20171001

二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...