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 .
All the weights are distrinct.
A set with m nodes 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 get ,(that
is, for
i from 1 to m-1).For any node in
the path from to (excluding and ),should
satisfy .
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 ().
Then following a line contains n integers (,all
the is
distrinct).Each of the following n-1 lines contain 2 integers and ,denoting
an edge between vertices and ().
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
2015 Multi-University Training Contest 3
Recommend
wange2014 | We have carefully selected several similar problems for you: 5326 5324 5323 5322 5321
/* 參考此人博客 :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\n",temp); } return 0; }