題意:給你一顆帶權二叉樹,求問要修改幾次可以將其變成二叉搜尋樹?
我們先跑出原樹的中序遍歷,那麼我們問題變成如何用最少的次數將序列變成嚴格上公升
顯然我們可以跑出lis,那麼n-lis就是答案,但是這樣做是有問題的,比如1,4,2,3,lis=3但是顯然我們只修改一次是不行的,因為序列要求嚴格上公升,我們可以以s[i]-i代替原來的s[i]重新跑lis這樣就沒問題了
#pragma gcc optimize("o3")
#pragma g++ optimize("o3")
#include
#include
#include
#define inf 0x7f7f7f7f
using
namespace
std;
int l[100010],r[100010],f[100010];
int s[100010],w[100010],n,t=0;
void mdfs(int x)
}int main()
mdfs(1); memset(f,127,sizeof f);
for(int i=1,j;i<=n;++i)
*upper_bound(f,f+n,w[i])=w[i];
printf("%d\n",n-(lower_bound(f,f+n,inf)-f));
}
改造二叉樹
description 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數...
改造二叉樹
題目描述 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數值。對於其中的...
改造二叉樹(bst)
題目大意 給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。演算法 二分 dp 一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。將這棵二叉樹中...