欢迎访问~原文出处——博客园-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=200000+5,M=N*2,mod=10007;
vector <int> son[N];
int n,w[N],sum[N],Max[N],ansMax,anssum;
void dfs(int prev,int rt){sum[rt]=Max[rt]=0;for (int i=0;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=1;i<=n;i++)son[i].clear();for (int i=1,a,b;i<n;i++){scanf("%d%d",&a,&b);son[a].push_back(b);son[b].push_back(a);}for (int i=1;i<=n;i++)scanf("%d",&w[i]);ansMax=anssum=0;dfs(0,1);printf("%d %d",ansMax,anssum*2%mod);return 0;
}

转载于:https://www.cnblogs.com/zhouzhendong/p/NOIP2014Day1T2.html

Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划相关推荐

  1. P1351 联合权值[鬼畜解法]

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

  2. 联合权值 NOIP2014 提高组 Day1 T2

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

  3. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

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

  4. [NOIP2014]联合权值

    NOIp2014提高组 [题目描述] 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为1 .图上两点( u ,  v ) 的距 ...

  5. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  6. 【学术篇】luogu1351[NOIP2014 提高组]联合权值

    一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一 ...

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

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

  8. 洛谷 1351 联合权值

    [题解] 每个点维护各个儿子的前后缀最大值.权值和,这样就可以统计儿子之间相乘的答案.然后每个节点再乘它的祖父的权值去更新答案即可. 1 #include<cstdio> 2 #inclu ...

  9. Jzoj3931【NOIP2014day1官方数据】联合权值

    题意略过,口胡正解 对于每个节点i,我们求出每个与i相连的节点的权值和s,那么i的贡献就是∑d[j]*(s-d[j]) 求最大就排个序咯 #include<stdio.h> #includ ...

  10. P1351-联合权值【树形结构】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1351 题目大意 一棵树,每个点有权值,求两个距离为2的点使权值之积 ...

最新文章

  1. python3 多级目录建立 os.makedirs()
  2. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
  3. XGBoost使用教程(与sklearn一起使用)二
  4. CentOS7 命令行变成-bash-4.2$
  5. c语言while运行出现错误,【图片】为什么我的while(1)不执行啊?【c语言吧】_百度贴吧...
  6. 六十万的成长_我的EA策略分析和实现
  7. 设计模式之结构类模式PK
  8. 高薪招聘生物信息工程师-中国科学院深圳先进技术研究院合成所合成生物大设施...
  9. 58 - 算法 - 百练 2503:Babelfish 二分查找与存储
  10. 原 CSS3中的过渡,css3之过渡
  11. 为什么 Rust 连续 4 年获「最受喜爱编程语言」?
  12. How to setup a DL4J project with eclipse
  13. pycharm导入opencv库失败解决方法
  14. 29.Linux/Unix 系统编程手册(上) -- 线程:介绍
  15. 详解MySQL中EXPLAIN解释命令(转)
  16. pyimagesearch-5 霍比特人和直方图 - 使用Python构建您的第一个图像搜索引擎的操作指南
  17. shp文件格式说明(二)
  18. 学生体质健康测试成绩测算软件,国家学生体质健康测试成绩自动生成模板
  19. B. Equalize by Divide - 思维+构造+排序
  20. 【2018/10/11】T3 - 0/1分数规划 - 葫芦

热门文章

  1. Linux四剑客详解——sed
  2. POJ--3984--迷宫问题
  3. 上次被人说TK不好咯,这次给你整个高大上的
  4. 【acl-访问控制列表】
  5. ducument.ready不生效的问题 ruby on rails
  6. 引擎工具开发的一些总结
  7. 我的2009:知识管理篇
  8. linux下grub的设置密码,grub设置密码
  9. socket编程遇到的bug记录
  10. Access to XMLHttpRequest at ‘url‘ from origin ‘null‘ has been blocked by CORS policy: Request header