WC模擬 優美的樹

2021-07-26 06:07:07 字數 1163 閱讀 1302

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

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

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

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

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

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

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

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

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

有多少。

n,k<=5000

wc的題果然勁,推了兩個小時還是沒有結果。。。

正解超級機智的說~

首先我們可以發現,一棵樹不可以變換為k-左偏樹的條件是從根節點出發到任意乙個葉子向左走的步數要小於k-1.

這樣就可以dp了,複雜度o(n^3)

那麼怎麼優化呢?

發現葉子很麻煩,我們每次都要保證每個非葉節點有2個兒子。

那麼我們可以把所有葉子節點給扔掉!!

這樣剩下的n-1個點就可以形態任意了,而且這n-1個點就可以決定這棵樹的形態。

那麼我們的約束就變成了從根節點出發到任意點向左走的步數要小於k-2.

我們沿著先序遍歷來放節點,fi,j表示從根節點到點i向左走了j次。

那麼i+1的話我們只能放在i的兒子,或者i的某個只有左兒子的祖先的右兒子。

可以發現這些點的狀態是fi+1,0,fi+1,1….,fi+1,j+1

那就顯然可以用字首和優化了。

這種東西考場上誰想得到嘛~

#include 

#include

#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;

const

int n=5005,mo=1e9+9;

int n,k,suf[n],f[n];

int main()

printf("%d\n",suf[0]);

} return

0;}

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

題目出自尛焱轟 眾所周知,樹是n 個節點n 1 條邊的結構,而所謂的優美的樹需要滿足如下條件 1.這是一棵有根二叉樹 2.非葉節點需有兩個兒子 3.不可以變換為k 左偏樹。所謂的k 左偏樹是指一棵有k 個葉子的樹,每個非葉節點的右兒子均為葉子且均有左兒子。所謂的變換指的是經過若干次如下兩種變換 1....

優美的閃電

一開始的思路是 當前剩餘權值最大的那個區間一定要被一發能 量為該區間權值的飛彈打掉,所以我們列舉該飛彈擊打位置,同 時我們刪除所有能被該飛彈擊打掉的區間,但是這只針對樣例,對於題目的其他資料就是不成立的。正確的是使用區間 dp,fi,j 表示座標被 i,j 完全包含 的區間最小需要花費的能量。則可以...

優美的句子

只言片語,溫暖人心 不亂於心,不困於情。如此,安好。不開心時,記得要讓心情轉個彎。出發去拾起,夢裡車輪碾過的風景。晨鐘淡淡,喚起一天的生機。丟掉煩惱,日子才能風輕雲淡。打足精神,讓今天成為最棒的一天。分享快樂,福己及人。皓月當空,清風徐徐,盡情享受。回首忙碌日,假期更顯貴。開心了就笑,不開心就過會再...