【選點】
時間限制: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...