Crazy Bobo
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 612 Accepted Submission(s): 189
Problem Description
Bobo has a tree,whose vertices are conveniently labeled by 1,2,...,n.Each node has a weight wi .
All the weights are distrinct.
A set with m nodesv1,v2,...,vm is
a Bobo Set if:
- The subgraph of his tree induced by this set is connected.
- After we sort these nodes in set by their weights in ascending order,we getu1,u2,...,um ,(that
is,wui<wui+1 for
i from 1 to m-1).For any node x in
the path from ui to ui+1 (excluding ui and ui+1 ),should
satisfy wx<wui .
Your task is to find the maximum size of Bobo Set in a given tree.
A set with m nodes
- The subgraph of his tree induced by this set is connected.
- After we sort these nodes in set by their weights in ascending order,we get
Your task is to find the maximum size of Bobo Set in a given tree.
Input
The input consists of several tests. For each tests:
The first line contains a integer n (1≤n≤500000 ).
Then following a line contains n integers w1,w2,...,wn (1≤wi≤109 ,all
the wi is
distrinct).Each of the following n-1 lines contain 2 integers ai and bi ,denoting
an edge between vertices ai and bi (1≤ai,bi≤n ).
The sum of n is not bigger than 800000.
The first line contains a integer n (
The sum of n is not bigger than 800000.
Output
For each test output one line contains a integer,denoting the maximum size of Bobo Set.
Sample Input
7 3 30 350 100 200 300 400 1 2 2 3 3 4 4 5 5 6 6 7
Sample Output
5
Source
Recommend
/* 參考此人博客 :http://www.mamicode.com/info-detail-948802.html 记得用c++交 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> using namespace std; #define N 800005 vector<int>g[N]; int n; int ans[N]; int a[N]; int dfs(int u) { if(ans[u]) return ans[u]; ans[u]=1; for(int i=0;i<g[u].size();i++) { int to=g[u][i]; ans[u]+=dfs(to); } return ans[u]; } int main() { int i,j; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) g[i].clear(); memset(ans,0,sizeof(ans)); int u,v; i=n-1; while(i--) { scanf("%d%d",&u,&v); if(a[u]<a[v]) g[u].push_back(v); else g[v].push_back(u); } int temp=0; for(i=1;i<=n;i++) { temp=max(temp,dfs(i)); } printf("%d ",temp); } return 0; }