hdu 5325 Crazy Bobo 乱搞+搜索

Crazy Bobo

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 218    Accepted Submission(s): 60

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 nodes v1,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 get u1,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.

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.

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5325

解题思路:反正我是智商余额不足。。。

AC代码:顺着题解思路DFS了一下= =

1 #pragma comment(linker, "/STACK:1024000000,1024000000")
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <stack>
13 #include <limits.h>
14 using namespace std;
15 typedef long long LL;
16 #define y1 y234
17 #define MAXN 500010 // 1e6
18 int n;
19 int a[MAXN];
20 vector<int> edge[MAXN];
21 int ans[MAXN];
22 void DFS(int u) {
23     ans[u] = 1;
24     int len = edge[u].size();
25     for(int i = 0; i < len; i++) {
26         int v = edge[u][i];
27         if(!ans[v]) DFS(v);
28         ans[u] += ans[v];
29     }
30 }
31 int main() {
32     while(~scanf("%d", &n)) {
33         memset(ans, 0, sizeof ans);
34         for(int i = 1; i <= n; i++) {
35             scanf("%d", &a[i]);
36             edge[i].clear();
37         }
38         int u, v;
39         for(int i = 1; i < n; i++) {
40             scanf("%d%d", &u, &v);
41             if(a[u] < a[v]) edge[u].push_back(v);
42             else if(a[v] < a[u]) edge[v].push_back(u);
43         }
44         for(int i = 1; i <= n; i++) {
45             if(ans[i]) continue;
46             DFS(i);
47         }
48         int maxn = -1;
49         for(int i = 1; i <= n; i++) {
50             maxn = max(ans[i], maxn);
51         }
52         printf("%d\n", maxn);
53     }
54     return 0;

55 }

时间: 2024-10-18 08:26:29

hdu 5325 Crazy Bobo 乱搞+搜索的相关文章

hdu 5325 Crazy Bobo dfs

// hdu 5325 Crazy Bobo // // 题目大意: // // 给你一棵树,树上每一个节点都有一个权值w,选择尽可能多的节点, // 这些节点相互联通,而且依照权值升序排序之后得到节点编号, // 需相邻节点之间的随意节点都要大于较小的节点. // // 解题思路: // 对于每一对u,v,我们建一条这种边:权值小的像权值大的连一条边. // 这样,问题就转化为求以u最小的权值为根的子树上点集的最大值. // dfs就可以. // // // 感悟: // // 多校的一道题目

HDU 5325 Crazy Bobo

对原来的边(u, v)  方向定为u->v当w[u] > w[v] 最大Set是max{u到达的点集合} Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 382    Accepted Submission(s): 116 Problem Description Bobo has a tree,whose ve

HDU 5325 CRAZY BOBO 排序

链接 Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 252    Accepted Submission(s): 74 Problem Description Bobo has a tree,whose vertices are conveniently labeled by 1,2,...,n.Each no

HDU 5325 Crazy Bobo(思路+dfs 记忆化)

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

HDU 5325 Crazy Bobo(深搜)

题意:给一个n,接着输入n个数,表示n个点的值,接着输入n-1条边形成一个生成树 问最大有多少个点的集合使得该集合内的所有点都满足如下:对于集合内点大小相邻的两个点,该两点之间经过的所有点的大小都小于该两点 eg  7 3 30 350 100 200 300 400 1 2 2 3 3 4 4 5 5 6 6 7 该无向图可表示为1--2--3--4--5--6--7   取点6对于集合(3-7)来说,正好比他大的点为点3,且他们之间的所有点的 大小都小于该两点,满足条件   同理取该集合内的

DFS/BFS+思维 HDOJ 5325 Crazy Bobo

题目传送门 1 /* 2 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 3 在树上的路径权值都小于这两个点 4 DFS/BFS+思维:按照权值的大小,从小的到大的连有向边,搜索最多连接点数即是答案.因为排序后,他们之间的路径, 5 可定都是从当前节点u连过去的,那么都是小于这两个节点的.DFS需手动加栈,BFS类似拓扑排序的思路 6 */ 7 #pragma comment (linker, "/STACK:1024000000,10240000

HDU 4937 Lucky Number 乱搞 + 优化

题意:给你一个数n (1- 1e12),问你有多少种进制使得 这个数用这个进制表示只有 3 . 4 . 5. 6 这4个数 解题思路:这里本来是想要枚举的,发现数太大了,这里利用到了一中很巧妙的优化方法,将 2位 和3位转化成为 一元一次 和一元二次方程,就可以有很大的优化,然后只需要枚举到7000即可 1 // File Name: 1003.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月12日 星期二 12时01分53秒 4 5

HDU 4952 Number Transformation 乱搞

题意:给你一个数x,给你K次操作,每一次x变为大于等于 x 且是 i 的倍数的数. 解题思路:可以知道  如果 变化以后  x 是i 和 i+1 的公倍数的倍数的话,那么x的值是不会变的,x  < i * i 的时候,x值肯定会变,每一次增大i(这里后面就可以直接用公式) 所以我们只需要枚举到前面那种情况就可以了. 解题代码: 1 // File Name: 1008.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月14日 星期四 13

HDOJ 5325 Crazy Bobo 树形DP

按照升序或者降序选择的点集可以满足条件..... 树上的每个节点可以从子节点转移,也可以从父亲节点转移 Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 100 Problem Description Bobo has a tree,whose vert