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

2021-09-10 21:44:39 字數 1706 閱讀 7031

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

一行乙個整數表示答案。
示例1

複製

5

1 5 4 2 3

3 24 5

0 00 0

0 0

複製

3
注意:dfs遍歷時,要從右子樹向左子樹進行遍歷

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps (1e-8)

#define max 0x3f3f3f3f

#define u_max 1844674407370955161

#define l_max 9223372036854775807

#define i_max 2147483647

#define re register

#define pushup() tree[rt]=max(tree[rt<<1],tree[rt<<1|1])

#define nth(k,n) nth_element(a,a+k,a+n); // 將 第k大的放在k位

#define ko() for(int i=2;i<=n;i++) s=(s+k)%i // 約瑟夫

#define ok() v.erase(unique(v.begin(),v.end()),v.end()) // 排序,離散化

using namespace std;

inline int read()

while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}typedef long long ll;

const double pi = atan(1.)*4.;

const int inf = 0x3f3f3f3f;

const ll inf = 0x3f3f3f3f3f3f3f3fll;

const int m=63;

const int n=1e5+5;

vectorv[n];

int a[n],p=0;

void dfs(int x)

int main()

for(int i=1;i<=n;i++)

dfs(1);

printf("%d\n",p);

return 0;

}

牛客練習賽39

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

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

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

牛客練習賽39D

首先操作2用並查集就行了。題解說的好啊!考慮操作一,連的兩個點如果同色,直接合併,然後這個顏色的聯通塊 1,然後合併bitset,就是或一下。bitset維護的是相連的異色結點。如果兩個點異色,那麼我們就不管他們,直接在兩個bitset裡分別把對方設為1。對於操作三 直接 b x b y count...