题目链接


题意:给定一个无根树,每个点有一个权值。若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\)。求所有的联合权值的和与最大值

分析

  • 暴力求,每个节点遍历一遍周围的点,对每个点再遍历一次
  • 可以拿到70分
  • 考虑正解。对于一个点\(u\),周围一圈可以到达的点中,从中任选两个不同的点\(i,j\),则这两个点构成联合权值。
  • 所以我们对一个点维护三个值:周围一圈点\(w_i\)之和\(sumw_u\),\(w_i\)的最大值\(first_u\),\(w_i\)的次大值\(second_u\)
  • 则在\(u\)周围一圈选取一个点\(i\)与圈上的其他点的所有联合权值之和为\(w_i \times (sumw_u-w_i)\);对于\(u\)周围一圈联合权值最大值为\(first_u \times second_u\)
  • 用dfs求一遍就行了

实现

  • 第一遍dfs求每个点的三个值
  • 第二遍求答案
  • 复杂度\(O(n)\)

注意事项

  • 取膜!
  • long long!

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6. #define int long long
  7. const int MAXN = 200200;
  8. const int MOD = 10007;
  9. int n, w[MAXN], cnt, Max = 0, ans, sumw[MAXN], vis1[MAXN], vis2[MAXN], first[MAXN], second[MAXN];
  10. struct edge
  11. {
  12. int v; edge *next;
  13. }pool[MAXN << 1], *head[MAXN];
  14. inline void addedge(int u, int v)
  15. {
  16. edge *p = &pool[++cnt], *q = &pool[++cnt];
  17. p->v = v, p->next = head[u]; head[u] = p;
  18. q->v = u, q->next = head[v]; head[v] = q;
  19. }
  20. void dfs1(int u)
  21. {
  22. vis1[u] = 1;
  23. for(edge *p = head[u]; p; p = p->next)
  24. {
  25. sumw[u] += w[p->v];
  26. if(first[u] < w[p->v]) second[u] = first[u], first[u] = w[p->v];
  27. else second[u] = max(second[u], w[p->v]);
  28. if(!vis1[p->v]) dfs1(p->v);
  29. }
  30. }
  31. void dfs2(int u)
  32. {
  33. vis2[u] = 1;
  34. Max = max(Max, first[u] * second[u]);
  35. for(edge *p = head[u]; p; p = p->next)
  36. {
  37. int lh = sumw[u] * w[p->v] - w[p->v] * w[p->v];
  38. ans = (ans + lh) % MOD;
  39. if(!vis2[p->v]) dfs2(p->v);
  40. }
  41. }
  42. #undef int
  43. int main()
  44. {
  45. memset(second, -1, sizeof(second));
  46. scanf("%d", &n);
  47. for(int i = 1; i < n; i++)
  48. {
  49. int u, v;
  50. scanf("%d%d", &u, &v);
  51. addedge(u, v);
  52. }
  53. for(int i = 1; i <= n; i++) scanf("%lld", &w[i]);
  54. dfs1(1);
  55. dfs2(1);
  56. printf("%lld %lld", Max, ans);
  57. return 0;
  58. }

题解【luoguP1351 NOIp提高组2014 联合权值】的更多相关文章

  1. NOIP 提高组 2014 联合权值(图论???)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 相关变量解释: int n; int fa[maxn];//fa[i] : i的 ...

  2. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  3. 【NOIP2014提高组】联合权值

    https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...

  4. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  5. [NOIp 2014]联合权值

    Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...

  6. 【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)

    题目来源:洛谷P1351 思路 由题意可得图为一棵树 在一棵树上距离为2的两个点有两种情况 当前点与其爷爷 当前点的两个儿子 当情况为当前点与其爷爷时比较好操作 只需要在传递时不仅传递父亲 还传递爷爷 ...

  7. NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...

  8. NOIp 2014 联合权值 By cellur925

    题目传送门 这题自己(真正)思考了很久(欣慰). (轻而易举)地发现这是一棵树后,打算从Dfs序中下功夫,推敲了很久规律,没看出来(太弱了). 开始手动枚举距离为2的情况,模模糊糊有了一些概念,但没有 ...

  9. NOIP提高组题目归类+题解摘要(2008-2017)

    因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...

随机推荐

  1. Java异常层次结构

    1. 如果是不可查异常(unchecked exception),即Error.RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在 ...

  2. AngularJS 初探

    AngularJS,诞生于2009年,由Misko Hevery等人创建,后为Google所收购.这是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为 ...

  3. 我的linux操作习惯

    标签(空格分隔): ubuntu 最佳操作 用linux随时可能会有宕机的危险,谁知道我哪会神经病犯了呢.用deepin宕机的可能性会更高的,所以我才不得不安装一个windows做备份,然后把数据备份 ...

  4. [leetcode-779-K-th Symbol in Grammar]

    On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace ...

  5. UVALive 3668 A Funny Stone Game(博弈)

    Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2,...,  ...

  6. Zen Coding && Emmet-Sublime 安装

    Sublime Text 插件之:Emmet,旧版称:ex-Zen Coding 更名之后增加了CSS3和HTML5许多新特性.项目地址也从 code.google 移 github. 安装: Pac ...

  7. eg_3

    3. 编写一个程序,返回一个 double 类型的二维数组,数组中的元素通过解析字符串参数获得,如字符串参数:“1,2;3,4,5;6,7,8”,则对应的数组为: d[0][0]=1.0, d[0][ ...

  8. iOS开发Interface Builder技巧

    1.使view的Size与view中的Content相适应:选中任意的一个view,然后Editor->Size to Fit Content,或者简单的按 ⌘=接着就会按照下面的规则对选中vi ...

  9. MVC4+EF5 edmx代码分析

    本文分析Entity Framework(EF)从数据库自动生成的模型文件代码(扩展名为edmx). 一. 概述 本文使用的数据库结构尽量简单,只有2个表,一个用户表和一个分公司表(相当于部门表),一 ...

  10. YaoLingJump开发者日志(三)

      开始第二关的筹建.   增加了地刺和会移动的砖块.   每次增加一个新东西都要改好多代码,好累吖.   把第二关搞出来后发现太难了,强行调整难度.   修复了一些bug.   调整难度后还是发现太 ...