P1351 联合权值

想刷道水题还交了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)的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P1351 联合权值 题解

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

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

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

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

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

  7. 【NOIP2014】联合权值 树上dp

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

  8. luogu P1351 联合权值

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

  9. 洛谷 P1351 联合权值

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

随机推荐

  1. Lua脚本和C++交互(二)

    上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到.熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么.如果你能熟练 ...

  2. ExtJS 6.2 基础使用

    一. 安装: 下载两个压缩包:分别是 ext-6.2.0-gpl(这个是ExtJS 的SDK文件,创建新项目的时候需要用). SenchaCmd-6.5.2-windows-64bit (这个下载下来 ...

  3. 图片上传Security Error

    jQuery.Uploadify v3.2.js 现在得到的一个原因是跨域 http://www.xuebuyuan.com/848255.html 最近项目中要用文件上传控件,我就想到了Upload ...

  4. LeetCode——Reverse Linked List

    反转链表,用了一个比较笨的方法. public class Solution { public ListNode reverseList(ListNode head) { if(head == nul ...

  5. Splay模板 1.0

    struct Splay{ int rt,sz; ///根节点,树节点总数 ],fa[N];///值,左右儿子,父亲 void spin(int t){ ///旋转操作 ]==t; son[x][y] ...

  6. Struts2中的OGNL详解 《转》

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. 关于PreparedStatement.addBatch()方法 (转)

    Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接,(打电话拨号 ) Connec ...

  8. centos7 elk install :ELK 安装 6.1.2版本

    参考:http://blog.csdn.net/h952520296/article/details/78873849 (参考) 官网下载:https://www.elastic.co/cn/down ...

  9. maven setting详细解读

    全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${user.home} ...

  10. 微信小游戏5.2.2 在子项目中使用EUI制作排行榜报错 wx.getFileSystemManager not function

    本来想子项目(开放数据域)想使用EUI来制作排行榜. 原5.1.11的时候是ok的.在5.2.2中,使用assetsmananger而不是res,则会报错wx.getFileSystemManager ...