题目链接


题意:给定一个无根树,每个点有一个权值。若两个点 \(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!

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define int long long
const int MAXN = 200200;
const int MOD = 10007; int n, w[MAXN], cnt, Max = 0, ans, sumw[MAXN], vis1[MAXN], vis2[MAXN], first[MAXN], second[MAXN];
struct edge
{
int v; edge *next;
}pool[MAXN << 1], *head[MAXN];
inline void addedge(int u, int v)
{
edge *p = &pool[++cnt], *q = &pool[++cnt];
p->v = v, p->next = head[u]; head[u] = p;
q->v = u, q->next = head[v]; head[v] = q;
}
void dfs1(int u)
{
vis1[u] = 1;
for(edge *p = head[u]; p; p = p->next)
{
sumw[u] += w[p->v];
if(first[u] < w[p->v]) second[u] = first[u], first[u] = w[p->v];
else second[u] = max(second[u], w[p->v]);
if(!vis1[p->v]) dfs1(p->v);
}
}
void dfs2(int u)
{
vis2[u] = 1;
Max = max(Max, first[u] * second[u]);
for(edge *p = head[u]; p; p = p->next)
{
int lh = sumw[u] * w[p->v] - w[p->v] * w[p->v];
ans = (ans + lh) % MOD;
if(!vis2[p->v]) dfs2(p->v);
}
}
#undef int
int main()
{
memset(second, -1, sizeof(second));
scanf("%d", &n);
for(int i = 1; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
for(int i = 1; i <= n; i++) scanf("%lld", &w[i]);
dfs1(1);
dfs2(1);
printf("%lld %lld", Max, ans);
return 0;
}

最新文章

  1. 使用Hudson搭建自动构建服务器
  2. 修改mongodb3.0副本集用户密码遇到的坑
  3. [转]c#截取指定长度的字符串
  4. zw版【转发&#183;台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式
  5. 如何用C表示排列组合?
  6. 引用传递&amp;值传递
  7. Linux Zynq GPIO中断
  8. Cannot mix incompatible Qt library (version 0x40801) with this library (version 0x40804)
  9. iOS 错误之 NSObject 、CGFloat
  10. CSS的position设置
  11. YII - 打印 SQL
  12. 视觉机器学习------KNN学习
  13. urllib3
  14. win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)
  15. 消除TortoiseSVN 检出到(checkout)桌面上显示一堆问号
  16. H - Gold Coins(2.4.1)
  17. cygwin完全安装步骤方法(过程图解)
  18. spark编译报错信息简介
  19. Reaction 开源可自定义实时的电商平台
  20. css图片变色变暗变亮

热门文章

  1. (转)GEM -次表面散射的实时近似
  2. DataTable转Json,Json转DataTable
  3. 关于LNMP常见问题和性能方面的个人理解
  4. P4语法(2) Parser
  5. servlet映射路径
  6. Alpha 冲刺2
  7. LintCode-140.快速幂
  8. Python 零碎信息-基础 01
  9. MHDD工具使用简写
  10. c++的一些编程技巧和细节