Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - Vijos1906
题意概括
有一棵树,每一个节点都有一个权值w[i]。下面说的x,y都是该树中的节点。
对于点对(x,y),x,y,保证x和y距离为2,那么他们就可以联合,会产生w[x]*w[y]的联合权值。
注意:点对(x,y)和(y,x)是不同的。
现在要回答两个问题:
1. 所有可以联合的点对的最大联合权值。
2. 对于所有不同的点对(x,y),求联合权值和,答案对10007取模。
题解
在一棵树上?
首先看完体面,觉得像一道树形dp题。
其实就是一道树形dp题。
我们按照dfs的顺序,首先,我们考虑较简单的一部分。
对于询问2,我可以先计算一半(点对的逆序也算不同)。
对于节点x,我们分成两种大情况考虑:
1. 它与它的儿子的儿子的联合权值。
2. 它的儿子和它的儿子的联合权值。
首先考虑第一种。
做法:
对于每一个节点,设置两个数组:sum[i]和Max[i],分别表示其子节点的权值和与最大权值。
这两个量是非常好维护的。
那么如何统计?
对于每一个节点,把它和它的儿子的儿子联合即可 —— 两次联合,分别对应两种询问,一次与儿子的sum结合,一次与儿子的Max结合。
然后第二种:
对于sum,其实很简单,对于当前累加的部分sum[rt](rt为当前节点),直接联合累加即可。
不解释,自己看代码。
那么max也差不多。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;
const int N=+,M=N*,mod=;
vector <int> son[N];
int n,w[N],sum[N],Max[N],ansMax,anssum;
void dfs(int prev,int rt){
sum[rt]=Max[rt]=;
for (int i=;i<son[rt].size();i++)
if (son[rt][i]!=prev){
int v=son[rt][i];
dfs(rt,v);
anssum=(anssum+w[rt]*sum[v])%mod;
ansMax=max(ansMax,w[rt]*Max[v]);
anssum=(anssum+sum[rt]*w[v])%mod;
ansMax=max(ansMax,w[v]*Max[rt]);
sum[rt]=(sum[rt]+w[v])%mod;
Max[rt]=max(Max[rt],w[v]);
}
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++)
son[i].clear();
for (int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
son[a].push_back(b);
son[b].push_back(a);
}
for (int i=;i<=n;i++)
scanf("%d",&w[i]);
ansMax=anssum=;
dfs(,);
printf("%d %d",ansMax,anssum*%mod);
return ;
}
Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划的更多相关文章
- P1351 联合权值(树形dp)
P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...
- vijos1906:联合权值
描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...
- 【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)
题目来源:洛谷P1351 思路 由题意可得图为一棵树 在一棵树上距离为2的两个点有两种情况 当前点与其爷爷 当前点的两个儿子 当情况为当前点与其爷爷时比较好操作 只需要在传递时不仅传递父亲 还传递爷爷 ...
- 【树形DP】【P1351】 【NOIP2014D1T2】联合权值
传送门 Description 无向连通图 \(G\) 有 \(n\) 个点, \(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\) ,每 ...
- [noip2014day1-T2]联合权值
无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离.对于图 G ...
- NOIP2014提高组 联合权值(距离为2的树形dp)
联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi,每条边的长度均为 11.图上两点 (u, v)(u, ...
- $Noip2014/Luogu1351$ 联合权值 树形
$Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...
- P1351 联合权值[鬼畜解法]
题目描述 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离 ...
- Codevs 3728 联合权值
问题描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每 条边的长度均为1.图上两点(u,v)的距离定义为u点到v点的最短距离.对于图G上的点 对(u,v),若它 ...
随机推荐
- buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五
执行完 board_init_f 后,跳回到 crt0.S中继续执行汇编语言 ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp, ...
- Android中的Service:Binder,Messenger,AIDL
http://blog.csdn.net/luoyanglizi/article/details/51594016 http://blog.csdn.net/luoyanglizi/article/d ...
- Android:XML简介 & 解析方式对比(DOM、SAX、PULL)
目录 示意图 1. 定义 XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式 2. 作用 对数据进行标记(结构化数据).存储 & ...
- freeRTOS中文实用教程3--中断管理之延迟中断处理
1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只 ...
- Jenkins实现定时、顺序编译
1 Jenkins实现定时.顺序编译 l Jenkins 编译流程:更新代码,编译公共服务,编译普通服务(普通服务依赖于公共服务).以下图为例,首先执行 update,再执行 icto_c ...
- bzoj 1803: Spoj1487 Query on a tree III(主席树)
题意 你被给定一棵带点权的n个点的有根数,点从1到n编号. 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小到大排序第k个点) 假设没有两个相同的点权. 输入格式: 第一行为整数n, ...
- day1 diff命令递归比较目录下的文件
一.diff实战 (1)递归比较文件夹下所有的文件及目录的不同 diff --brief -Nr dir1/ dir2/ Reference ...
- [学习笔记]JS 数组Array push相关问题
前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...
- viewpager显示图片的Adapter
package com.ming.chiye.yishanghorse.Adapter; import android.content.Context; import android.graphics ...
- caffe:fine-tuning
http://blog.csdn.net/u010402786/article/details/70141261 https://zhuanlan.zhihu.com/p/22624331