牛客練習賽39 B 選點(二叉樹遍歷 LIS)

2021-09-10 15:52:58 字數 1608 閱讀 2440

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

有一棵n個節點的二叉樹,1為根節點,每個節點有乙個值w

iw_i

wi​。現在要選出盡量多的點。

對於任意一棵子樹,都要滿足:

如果選了根節點的話,在這棵子樹內選的其他的點都要比根節點的值

如果在左子樹選了乙個點,在右子樹中選的其他點要比它

第一行乙個整數n。第二行n個整數w

iw_i

wi​,表示每個點的權值。

接下來n

nn行,每行兩個整數a,b

a,ba,

b。第i+2

i+2i+

2行表示第i

ii個節點的左右兒子節點。沒有為000。

n ,a

,b≤1

05,−

2×10

9≤wi

≤2×1

09

n,a,b≤10^5,−2×10^9≤w_i≤2×10^9

n,a,b≤

105,

−2×1

09≤w

i​≤2

×109

一行乙個整數表示答案。

5

1 5 4 2 3

3 24 5

0 00 0

0 0

3
題目要求選出來的點滿足:左兒子權值》右兒子權值》父親權值。對二叉樹進行後續遍歷,可以得到左兒子->右兒子->父親的排列,然後對遍歷得到的結果反向求lis即可

#include

#define ll long long

#define ull unsigned long long

#define ms(a,b) memset(a,b,sizeof(a))

#define inf 0x7f7f7f7f

const

int maxn=

1e5+10;

const

int mod=

1e9+7;

using

namespace std;

int w[maxn]

;int arr[maxn]

;int ar[maxn]

;int dp[maxn]

;struct wzy

p[maxn]

;int cnt;

void

get_arr

(int x)

intmain

(int argc,

char

const

*ar**)

get_arr(1

);for(

int i=

0;i) ar[cnt-i-1]

=arr[i]

;int len=0;

for(

int i=

0;i) cout

}

牛客練習賽39 B 選點 dfs序 LIS

選點 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 有一棵n個節點的二叉樹,1為根節點,每個節點有乙個值wi。現在要選出盡量多的點。對於任意一棵子樹,都要滿足 如果選了根節點的話,在這棵子樹內選的其他的點都要比...

(dfs LIS)牛客練習賽39 選點

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 有一棵n個節點的二叉樹,1為根節點,每個節點有乙個值wi。現在要選出盡量多的點。對於任意一棵子樹,都要滿足 如果選了根節點的話,在這棵子樹內選的其他的點都要比根節點...

牛客(39)平衡二叉樹

題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。public boolean isbalanced solution treenode root 它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。if math.abs treedepth root...