BZOJ3227 紅黑樹,打表找規律 DP

2021-07-29 21:05:34 字數 1662 閱讀 7465

傳送門

思路:

很有意思的一道題

dp思路十分顯然,我們以最小值為例

f[x][h][0/1]表示節點數為x的子樹,該樹的黑高度為h,根節點顏色為紅/黑時 f[

x][h

][0]

=min+1

f[x][h]

[1]=

min 0≤

y複雜度是o(

n3) 的,一開始並沒有想到怎麼優化

看看只輸入乙個數。。。打表!

但是跑得太慢了,所以就把前100的答案拿出來觀察一番

瞪眼觀察了半天後,發現最大值g[

n]有這樣的規律 當n

=2k 時 g[

n]=g

[n−1

]−⌈k

2⌉+1

當n=2k⋅s

(s>1)

時 g[

n]=g

[n−1

]−⌊k

−12⌋

最小值沒(lan)有(de)看(kan)出(le),翻了一下oeis(啪),發現是catalan數每一項的2的冪指數

表示奧妙重重而且不會證明反正是對的就行了

(這裡我還推錯了幾次,有一次竟然a了,發現資料規模很小,感人至深)

#include

#include

#include

using

namespace

std;

int n;

int f[5005],g[5005],bit[20005];

main()

printf("%d\n%d\n",f[n],g[n]);

}

我們返回來看原先的dp式子

雖然不會寫紅黑樹,但我們還是很容易感受出來一顆紅黑樹是不會很長的,它的節點分布一定很平均

實際上,一顆黑高度為

h 的紅黑樹,它的內節點數至少為2h

−1(比較顯然,只要所有節點都是黑節點就可以了),那也就是說對於一顆節點數為

x 的紅黑樹,它的深度不超過

⌊log2(

x+1)

⌋,所以我們dp時列舉黑高度的次數由o(

n)減小到了o(

logn

) !,複雜度o(

n2logn

) ,表示這個複雜度在本機上很難過,不過codevs上好像跑的還挺快?

反正xjb優化了一些東西後,本機跑n=5000終於能進2s了

#include#includeusing namespace std;

int n;

int f[5005][17][2],g[5005][17][2];

inline int

min(int x,int y)

inline int

max(int x,int y)

main()

int mi=10000,mx=0;

for (int i=1;(1

<1)<=n+1;++i)

mi=min(mi,min(f[n][i][0],f[n][i][1])),

mx=max(mx,max(g[n][i][0],g[n][i][1]));

printf("%d\n%d\n",mi,mx);

}

雜湊表和紅黑樹

hash,也可以稱為 雜湊 就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出 也就是多對一的關係 在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的...

雜湊表和紅黑樹的對比

hash,也可以稱為 雜湊 就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出 也就是多對一的關係 在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的...

雜湊表和紅黑樹的對比

hash,也可以稱為 雜湊 就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出 也就是多對一的關係 在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的...