\(\Large\textbf{Description:}\) \(\large一棵树,父子之间距离为1,求距离为2的两点点权之积的最大值与和。\)

\(\Large\textbf{Solution:}\)\(\large考虑到边权为1,那么距离为2的两点可能问爷爷与孙子的关系,或者为兄弟的关系。那么对于一个点,它对答案的贡献是它所有孙子的点权之和与它的点权的积加上它与所有兄弟的有兄弟的点权的积。那么我们只需遍历一遍树即可,时间复杂度O(n)。\)

\(\Large\textbf{Code:}\)

#include <cstdio>
#include <algorithm>
#include <iostream>
#define LL long long
#define gc() getchar()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
using namespace std;
const int N = 2e5 + 5;
const int Mod = 10007;
int n, m, cnt, a[N], head[N];
LL ans, Max, sum[N]; struct Edge {
int to, next;
}e[N << 1]; struct Node {
LL su, max12; //开一个结构体 存储其孙子的点权之和与点权最大值。
Node() {
su = max12 = 0;
}
}; inline int read() {
char ch = gc();
int ans = 0, flag = 1;
while (ch > '9' || ch < '0') {
if (ch == '-') flag = -1;
ch = gc();
}
while (ch >= '0' && ch <= '9') ans = (ans << 1) + (ans << 3) + ch - '0', ch = gc();
return ans * flag;
} inline void add(int l, int r) {
e[++cnt].to = r;
e[cnt].next = head[l];
head[l] = cnt;
} inline LL max(LL x, LL y) {
return x >= y ? x : y;
} inline Node dfs(int now, int fa) {
Node q, x;
LL an = 0, s = 0;
LL max1 = 0, max2 = 0;
for (int i = head[now]; i ; i = e[i].next) {
int u = e[i].to;
if (u != fa) {
an = an + a[u];
ans = (ans + sum[now] * a[u] % Mod) % Mod;
sum[now] = (sum[now] + a[u]) % Mod;
x = dfs(u, now);
s = s + x.su;
q.max12 = max(q.max12, a[u]);
if (a[u] > max1) max2 = max1, max1 = a[u];
else if (a[u] > max2) max2 = a[u];
}
else continue;
}
if (max2) Max = max(Max, max1 * max2);
Max = max(Max, x.max12 * a[now]);
ans = (ans + s * a[now] % Mod) % Mod;
q.su = an;
return q;
} int main() {
n = read();
int l, r;
rep(i, 2, n) l = read(), r = read(), add(l, r), add(r, l);
rep(i, 1, n) a[i] = read();
dfs(1, 0);
ans = (ans << 1) % Mod;
printf("%lld %lld\n", Max, ans);
return 0;
}

\(\Large\color{pink}{by}\) \(\Large\color{pink}{Miraclys}\)

洛谷P1351 联合权值的更多相关文章

  1. 洛谷 P1351 联合权值 题解

    P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\)​,每条 ...

  2. [NOIP2014] 提高组 洛谷P1351 联合权值

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

  3. 洛谷 P1351 联合权值

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

  4. 洛谷——P1351 联合权值

    https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...

  5. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

  6. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  7. 洛谷 P1351 联合权值 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...

  8. 洛谷 1351 联合权值——树形dp

    题目:https://www.luogu.org/problemnew/show/P1351 对拍了一下,才发现自己漏掉了那种拐弯的情况. #include<iostream> #incl ...

  9. P1351 联合权值(树形dp)

    P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...

随机推荐

  1. 001. 使用IDEA新建一个JAVA最简单的Spring MVC JAVAWEB程序

    1. 我们打开一个空的IDEA 2. 选择Java之后点击Next 3. 点击Next创建空白工程 4. 给工程取个名字,叫MYIDEA 5. 勾选之后,点击This Window按钮 6. 我们可以 ...

  2. List转为字符串

    2019-12-12 20:34:16 方法1: 转换后的格式为:"('111','112','1113')" List list = new ArrayList<>( ...

  3. eclipse 快速隐藏所有方法的代码块

    java开发中往往一个class文件中会有很多方法,一个方法的实现代码有时候特别长 我个人就喜欢把无关的方法代码全部隐藏起来,只打开当前需要编辑的代码就行了(不喜欢看导航视图,容易头晕) Ctrl+s ...

  4. 弹出USB大容量存储设备时出问题的解决方法

    我的计算机->管理->系统工具->事件查看器->自定义视图->Kernel-Pnp->详情->进程ID 然后在任务管理器里找到该进程(任务管理器->查看 ...

  5. PaperReading20200227

    CanChen ggchen@mail.ustc.edu.cn   Neural Predictor for Neural Architecture Search Motivation: Curren ...

  6. 浅谈区块链和p2p网络

    最近对区块链产生了兴趣就去了解了一下,分享一下.... 首先要先了解一下什么叫做区块链: 区块链:简单来说就是一种基于分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式. 相信说 ...

  7. How to backup on MSSQL by table level ?

    MSSQL is good database.   Unlike as Oracle,  it seems that can not backup sqlserver databasee tables ...

  8. Day11 - K - Good Luck in CET-4 Everybody! HDU - 1847

    大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...

  9. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  10. Py西游攻关之基础数据类型(六)-文件操作

    Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 九 文件操作 9.1 对文件操作流程 打 ...