题解【luoguP1351 NOIp提高组2014 联合权值】
题意:给定一个无根树,每个点有一个权值。若两个点 \(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;
}
												
											题解【luoguP1351 NOIp提高组2014 联合权值】的更多相关文章
- NOIP 提高组 2014 联合权值(图论???)
		
传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 相关变量解释: int n; int fa[maxn];//fa[i] : i的 ...
 - Noip2014 提高组 T2 联合权值  连通图+技巧
		
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
 - 【NOIP2014提高组】联合权值
		
https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...
 - Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)
		
Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...
 - [NOIp 2014]联合权值
		
Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...
 - 【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)
		
题目来源:洛谷P1351 思路 由题意可得图为一棵树 在一棵树上距离为2的两个点有两种情况 当前点与其爷爷 当前点的两个儿子 当情况为当前点与其爷爷时比较好操作 只需要在传递时不仅传递父亲 还传递爷爷 ...
 - NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)
		
传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...
 - NOIp 2014 联合权值 By cellur925
		
题目传送门 这题自己(真正)思考了很久(欣慰). (轻而易举)地发现这是一棵树后,打算从Dfs序中下功夫,推敲了很久规律,没看出来(太弱了). 开始手动枚举距离为2的情况,模模糊糊有了一些概念,但没有 ...
 - NOIP提高组题目归类+题解摘要(2008-2017)
		
因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...
 
随机推荐
- leetcode-位1的个数(位与运算)
			
位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000 ...
 - bootstrap使用中遇到的坑
			
一.例如: <div class="form-group"> <label class="control-label col-lg-3"> ...
 - python切片详解
			
先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递 ...
 - 如何用vs查看框架函数管道模型
			
调试状态下 函数调用的 代码图,我们可以看到MVC框架的函数管道模型 源文章标题: 源文章:https://www.cnblogs.com/1996V/p/9037603.html 扩展阅读:http ...
 - 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能
			
本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...
 - 【Docker 命令】- inspect命令
			
docker inspect : 获取容器/镜像的元数据. 语法 docker inspect [OPTIONS] NAME|ID [NAME|ID...] OPTIONS说明: -f :指定返回值的 ...
 - ResultSet 可滚动性和可更新性
			
JDBC 2.0 API 为结果集增加了两个新的基本能力:可滚动性和可更新性,我想肯定满足了你的要求.在滚动结果集中可用的方法有: rs.previous();//向前滚动 rs.next();//向 ...
 - 第72天:jQuery实现下拉菜单
			
jQuery实现下拉菜单 一.居中 1.块元素居中:给块元素本身设置:margin:0 auto;,块元素必须设置宽度 2.行内块元素居中:给元素父级设置text-algin:center; < ...
 - RT-thread v2.1.0修正版
			
RT-Thread v2.1.0是v2.0.1正式版这个系列的bug修正版.RT-Thread v2.1.0修正的主要内容包括: 这个版本经历的时间比较长,并且原定的一些目标也还未能完成(更全的POS ...
 - 使用getRequestDispatcher跳转后 能获取到request.setAttribute数据 分析