金題大戰Vol 0 D 二叉搜尋樹

2022-01-10 17:19:38 字數 1056 閱讀 6026

有\(n\)個結點,第\(i\)個結點的權值為\(i\)。

你需要對它們進行一些操作並維護一些資訊,因此,你需要對它們建立一棵二叉搜尋樹。在整個操作過程中,第\(i\)個點需要被操作\(x_i\)次,每次你需要從根結點一路走到第\(i\)個點,耗時為經過的結點數。最小化你的總耗時。

第一行乙個整數\(n\),第二行\(n\)個整數\(x1-xn\)。

一行乙個整數表示答案。

5

8 2 1 4 3

對於\(10\%\)的資料,\(n<=10\)。

對於\(40\%\)的資料,\(n<=300\)。

對於\(70\%\)的資料,\(n<=2000\)。

對於\(100\%\)的資料,\(n<=5000,1<=x_i<=10^9\)。

我們可以這樣想,在乙個二叉搜尋樹中,乙個節點左兒子的權值一定小於該節點的權值,乙個節點右兒子的權值一定大於該節點的權值

因此,我們可以把連續的一段區間看成乙個子樹,列舉區間中的節點作為根節點

我們發現這就是乙個區間\(dp\)

狀態轉移方程為 \(f[l][r]=f[l][k-1]+f[k+1][r]+sum[r]-sum[l-1]\)

用四邊形不等式可以優化到\(n^2\)

#includeusing namespace std;

const int maxn=5e3+5;

typedef long long ll;

ll f[maxn][maxn],sum[maxn];

int g[maxn][maxn],a[maxn];

inline int read()

while(ch>='0' && ch<='9')

return x*f;

}int main()

for(register int d=2;d<=n;d++)

}} }

printf("%lld\n",f[1][n]);

return 0;

}

每日刷題 恢復二叉搜尋樹

二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 例 1 輸入 1,3,null,null,2 1 3 2輸出 3,1,null,null,2 3 1 2例 2 輸入 3,1,4,null,null,2 3 1 4 2輸出 2,1,4,null,null,3 2 1 4...

PTA 是否二叉搜尋樹(函式題)

本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。bool isbst bintree t 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 函式isbst須判斷給定的t是否二叉搜尋樹...

刷題 樹篇 98 驗證二叉搜尋樹

98.驗證二叉搜尋樹 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸...