P1351 联合权值(树形dp)
想刷道水题还交了3次.....丢人
(1.没想到有两个点都是儿子的状况 2.到处乱%(大雾))
先dfs一遍处理出父亲$fa[x]$
蓝后再一遍dfs,搞搞就出来了。
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
using namespace std;
const int p=;
int max(int &a,int &b){return a>b?a:b;}
#define N 200002
int n,fa[N],val[N],f1[N],f2[N];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<];
void adde(int x,int y){
nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
void dfs1(int x,int ffa){//处理fa数组
fa[x]=ffa;
for(int i=hd[x];i;i=nxt[i])
if(poi[i]!=ffa)
dfs1(poi[i],x);
}
void dfs2(int x){
int mxd=,tot=;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==fa[x]) continue;
f1[x]=max(f1[x],val[to]*mxd);
f2[x]=1ll*(f2[x]+val[to]*tot)%p;
mxd=max(mxd,val[to]);//以上为构成联合权值的2个点都是儿子的情况
tot=(tot+val[to])%p;
dfs2(to);
f1[x]=max(f1[x],f1[to]);
f2[x]=1ll*(f2[x]+f2[to])%p;
}
int g=fa[fa[x]],v=val[x]*val[g];//点x和x的爷爷构成联合权值
f1[g]=max(f1[g],v);
f2[g]=1ll*(f2[g]+v)%p;
}
int main(){
scanf("%d",&n); int q1,q2;
for(int i=;i<n;++i){
scanf("%d%d",&q1,&q2);
adde(q1,q2); adde(q2,q1);
}
for(int i=;i<=n;++i) scanf("%d",&val[i]);
dfs1(,); dfs2(); f2[]=1ll*f2[]*%p;//记得*2
printf("%d %d",f1[],f2[]);
return ;
}
P1351 联合权值(树形dp)的更多相关文章
- 洛谷P1351 联合权值(树形dp)
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
- 洛谷 P1351 联合权值 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...
- 洛谷 1351 联合权值——树形dp
题目:https://www.luogu.org/problemnew/show/P1351 对拍了一下,才发现自己漏掉了那种拐弯的情况. #include<iostream> #incl ...
- 洛谷 P1351 联合权值 题解
P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条 ...
- P1351 联合权值[鬼畜解法]
题目描述 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离 ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 【NOIP2014】联合权值 树上dp
题目描述 Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定 ...
- luogu P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 洛谷 P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
随机推荐
- Lua脚本和C++交互(二)
上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到.熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么.如果你能熟练 ...
- ExtJS 6.2 基础使用
一. 安装: 下载两个压缩包:分别是 ext-6.2.0-gpl(这个是ExtJS 的SDK文件,创建新项目的时候需要用). SenchaCmd-6.5.2-windows-64bit (这个下载下来 ...
- 图片上传Security Error
jQuery.Uploadify v3.2.js 现在得到的一个原因是跨域 http://www.xuebuyuan.com/848255.html 最近项目中要用文件上传控件,我就想到了Upload ...
- LeetCode——Reverse Linked List
反转链表,用了一个比较笨的方法. public class Solution { public ListNode reverseList(ListNode head) { if(head == nul ...
- Splay模板 1.0
struct Splay{ int rt,sz; ///根节点,树节点总数 ],fa[N];///值,左右儿子,父亲 void spin(int t){ ///旋转操作 ]==t; son[x][y] ...
- Struts2中的OGNL详解 《转》
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- 关于PreparedStatement.addBatch()方法 (转)
Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接,(打电话拨号 ) Connec ...
- centos7 elk install :ELK 安装 6.1.2版本
参考:http://blog.csdn.net/h952520296/article/details/78873849 (参考) 官网下载:https://www.elastic.co/cn/down ...
- maven setting详细解读
全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${user.home} ...
- 微信小游戏5.2.2 在子项目中使用EUI制作排行榜报错 wx.getFileSystemManager not function
本来想子项目(开放数据域)想使用EUI来制作排行榜. 原5.1.11的时候是ok的.在5.2.2中,使用assetsmananger而不是res,则会报错wx.getFileSystemManager ...