码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 338(Div 2) Longtail Hedgehog 解题报告

时间:2016-01-10 16:56:47      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://codeforces.com/problemset/problem/615/B

题目意思:要画一只 hedgehog,由 tail 和 spines 组成。我们要求得 beauty 最大值: tail * spines。

以下摘自 udon 原话,大家细细品味:(不一定是正确无误的哦,可能要误导他人成分。。。)

  1、对于所有点 x,求出 x 的度数 d[x],O(n+m)

  2、对于所有点 x,求出以点 x 为结尾的最长链长度 l[x],由于尾巴节点要求递增,符合DAG性质,从 1 点开始 BFS 就可以了,O(n+m)

  3、枚举所有 x,比较出 l[x] * d[x] 最大值,得出答案, O(n),总复杂度O(n+m)

  spines其实就是tail最后一个点的度数,也就是tail确定之后,spines就自然出来了(spines等价于度数)

  这句话主要是给我看的:我们不是要spines最优(我之前一直被这个变量迷惑了= =),而是要 tail * spines 最优

  以下也是他的话:

############################  听udon一席话,胜读十年书呢 ^_^

分享下捻尼题既思路,其实就系物理常用控制变量法:
1、发现最后答案 res = max(tails * spines),有两个变量
2、简化下问题,我先假设spines一定的情况下,答案貌似就系tails最大值,已经系经典题目了
但系甘样要枚举所有度数下的tails最优值,超时
3、我再假设tails不变,情况下,根据定义spines就系tails最后一个点既度数数,嗟系
tails可以确定spines,唔洗求最优值!!
4、甘样我地久唔洗枚举度数,枚举tails就可以了

#############################

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 using namespace std;
 8 
 9 typedef long long LL;
10 
11 const int maxn = 1e5 + 5;
12 vector<int> edge[maxn];
13 LL dp[maxn];
14 
15 int main()
16 {
17     #ifndef ONLINE_JUDGE
18         freopen("in.txt", "r", stdin);
19     #endif // ONLINE_JUDGE
20 
21     int n, m;
22     while (scanf("%d%d", &n, &m) != EOF) {
23 
24         int u, v;
25         for (int i = 0; i < m; i++) {
26             scanf("%d%d", &u, &v);
27             edge[u].push_back(v);
28             edge[v].push_back(u);
29         }
30         LL ans = -1;
31         for (int i = 1; i <= n; i++) {
32             dp[i] = 1;
33             sort(edge[i].begin(), edge[i].end());
34             for (int j = 0; j < edge[i].size(); j++) {
35                 if (edge[i][j] > i) continue;
36                 dp[i] = max(dp[i], dp[edge[i][j]]+1);
37             }
38             ans = max(ans, dp[i]*(int)edge[i].size());
39         }
40         printf("%lld\n", ans);
41         for (int i = 1; i <= n; i++) {
42             edge[i].clear();
43         }
44     }
45 
46     return 0;
47 }

 

codeforces 338(Div 2) Longtail Hedgehog 解题报告

标签:

原文地址:http://www.cnblogs.com/windysai/p/5118700.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!