時間限制: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...