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