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