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

题目链接: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 }
时间: 2024-12-28 04:45:52

codeforces 338(Div 2) Longtail Hedgehog 解题报告的相关文章

codeforces 505A. Mr. Kitayuta&#39;s Gift 解题报告

题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串. /**************************************(又到自我反省时刻) 做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文.但是由于

Codeforces Round #306 (Div. 2) D.E. 解题报告

D题:Regular Bridge 乱搞.构造 这题乱搞一下就行了.构造一个有桥而且每个点的度数都为k的无向图.方法很多,也不好叙述.. 代码如下: #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <map> #include <algorithm> #define INF 0x

Codeforces 130A - Testing Pants for Sadness(解题报告)

Testing Pants for SadnessCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 103A Description The average miner Vaganych took refresher courses. As soo

codeforces 499A.Inna and Pink Pony 解题报告

题目链接:http://codeforces.com/problemset/problem/499/A 题目意思:有两种按钮:1.如果当前观看的时间是 t,player 可以自动处理下一分钟,姑且理解为跳到t+1:  2.直接跳过 x 分钟,如果player在第 t 分钟,则可以跳到 t+x.问恰好可以看完 n 部电影的最少观看时间.观看一部电影表示 li, li+1, li+2, ..., ri-1, ri 的时间都要覆盖到. 一开始做的时候想得太简单了,确实需要每部电影的所有时间,但是如果不

codeforces 510B. Fox And Two Dots 解题报告

题目链接:http://codeforces.com/problemset/problem/510/B 题目意思:给出 n 行 m 列只有大写字母组成的字符串.问具有相同字母的能否组成一个环. 很容易知道要用到深搜.暴力搜索--- 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 cons

codeforces 556B. Case of Fake Numbers 解题报告

题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每按一次 button,每个齿轮都会有且仅有一个活动的tooth,对于偶数编号的齿轮,它下一个活动tooth是紧挨着当前tooth的逆时针方向的那个:而奇数编号的齿轮,下一个活动tooth是顺时针的那个.给出每个齿轮的活动tooth,问通过按下有限次的button,问能不能得到一个0,1,...,n-

CodeForces 501B(STL_H题)解题报告

题目链接:http://codeforces.com/problemset/problem/501/B -------------------------------------------------------------------------------- 题意:N个改名操作,要求输出最开始和最终的名字 思路:利用map的操作,读取输入之后,查找是否在key中,如果不在key中,建立新的关系.如果在key中,建立新的key-value对,擦除旧的key-value对.最终通过迭代器输出k

CodeForces 915C(DFS_E题)解题报告

题目链接:http://codeforces.com/problemset/problem/915/C --------------------------------------------------------------------------------- 题意:给你两个数 a和 b,可以打乱 a每位数的顺序,让你求满足 小于等于b 的最大值.. 思路:首先,观察到数值比较大,所以采用字符串读入的方式进行处理,通过比较字典序,交换不同位数是的保证每一次操作都是最优解. 代码: #inc

CodeForces 689B(BFS_B题)解题报告

题目链接:http://codeforces.com/problemset/problem/689/B -------------------------------------------------------------------------------- 题意:在一条直线上有n个城市,相邻两个城市之间的花费为1,但是有捷径,可以到捷径所在的点,而且只需要1的花费,捷径不能前往之前的城市. 思路:经典的,bfs打板直接过.唯一要注意的是这种情况,如4-7有捷径,所以有可能到6的最短路径为