改造二叉樹 Tree LTS

2021-06-26 17:46:47 字數 1284 閱讀 7250

. 【noip2014模擬10.26】改造二叉樹 (standard io)

time limits: 1000 ms  memory limits: 262144 kb     

description

小y在學樹論時看到了有關二叉樹的介紹:在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作「左孩子」和「右孩子」。二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。

什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key[p]表示結點p上的數值。對於其中的每個結點p,若其存在左孩子lch,則key[p]>key[lch];若其存在右孩子rch,則key[p]

100 % :n <= 10 ^ 5 ,  ai < 2 ^ 31. 

20% :暴力。

40% :可以用 dp 或者貪心或者神奇的暴力等其他奇怪的方法完成。

60% :正解的 lis 打成 o(n ^ 2)。

10% :首先求出這顆二叉樹的中序遍歷,那麼問題就轉換成用最少的修改次數使這個整

數序列嚴格單調遞增。於是很自然的想到了 lis,但單純用 lis 是有一些問題的,

比如這種情況:2 3 1 4, lis 為 2 3 4,答案求出來為 1,但由於整數的限制,應該

要修改 2 次。即直接 lis 求出的答案是在非嚴格遞增的情況下的答案。

所以我們將原序列稍加修改,乙個常見的將嚴格遞增整數序列對映成非嚴格遞增整

數序列的技巧就是將如下序列:

a1, a2, a3, a4 . an 對映成:

a1 - 1, a2 - 2, a3 - 3, a4 - 4 . an - n.

(這種方法常見於計數類問題)。

這樣對映後求最長不下降子串行的長度就沒問題了。 **

#include

#include

#include

#include

using namespace std;

int i,j,k,n,f[100100],t;

struct nodet[100100];

void dfs(int p)

int lis()

}sta[l]=f[i];

} }return top;

}int main()

for(i=2;i<=n;i++)

dfs(1);

for(i=1;i<=n;i++)f[i]-=i;

int ans=n-lis();

printf("%d",ans);

}

改造二叉樹

description 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數...

改造二叉樹

題目描述 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數值。對於其中的...

改造二叉樹(bst)

題目大意 給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。演算法 二分 dp 一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。將這棵二叉樹中...