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

2021-09-10 17:26:44 字數 1084 閱讀 3354

【選點】

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

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

64bit io format: %lld

有一棵n個節點的二叉樹,1為根節點,每個節點有乙個值wi。現在要選出盡量多的點。

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

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

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

第一行乙個整數n。

第二行n個整數wi,表示每個點的權值。

接下來n行,每行兩個整數a,b。第i+2行表示第i個節點的左右兒子節點。沒有為0。

n,a,b≤105,−2×109≤wi≤2×109n,a,b≤105,−2×109≤wi≤2×109

一行乙個整數表示答案。
5

1 5 4 2 3

3 24 5

0 00 0

0 0

3
【題解】

實不相瞞,我題都(kan)看(le)不(ban)懂(tian)。

題意:給定每個節點的權值和每個節點的左右兒子(為0即沒有兒子),輸出最多可選定的點。要求選擇時權值滿足:根節點《右節點《左節點。

思路:因為要求根節點《右節點《左節點,所以按照先根,再右子樹,再左子樹的順序dfs整棵樹(相當於二叉樹先序遍歷),求出dfs序,再在dfs序上求最長上公升子串行。複雜度o(nlogn)。

【**】

#include using namespace std;

const int maxn=100005;

int w[maxn],lson[maxn],rson[maxn];

int q[maxn],f[maxn];

int tot;

void dfs(int u)

int main()

} printf("%d",cnt);

return 0;

}

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

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

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

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

牛客練習賽39

b 進行根 右 左的樹遍歷。然後求最長上公升子串行長度。include include include include include include includeusing namespace std define ll long long const int maxn 2e5 22 int t...