$Luogu$

$Description$

给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所有的联合权值之和.注意这两个数是有序的,翻译成人话就是求完和之后要$*2$.

$Sol$

想起了消防局的设立$ovo$.

距离为$2$的点,它们不是兄弟就是祖孙,那直接$dfs$一遍更新答案就好了叭.

兄弟之间更新答案这里有两个优化:

1.贪心.把所有的兄弟加入数组$s$之后按照$w[i]$从大到小排序,一遍枚举$i>1$,

用$w[s[i]]*w[s[1]]$更新最大值.

2.乘法分配率.假设这里有三个兄弟的权值分别为$a,b,c$,那么联合权值之和就是

$a*b+a*c+b*c=a*(b+c)+b*c$.说到这里小学生都会了$ovo$.

$Code$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define e(i,u) for(Rg int i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=,mod=;
int n,ct,b[N],w[N],as1,as2;
struct node{int v,nt;}a[N*];
il void add(int u,int v){a[++ct]=(node){v,b[u]};b[u]=ct;}
il bool cmp(int x,int y){return w[x]>w[y];}
il void dfs(int u,int f)
{
Rg int s[N],nm=,dat;s[]=;
e(i,u)
{
Rg int v=a[i].v;
if(v==f)continue;
dfs(v,u);
s[++nm]=v;
dat=w[v]*w[f];
as1=max(as1,dat);as2=(as2+dat%mod)%mod;
}
sort(s+,s+nm+,cmp);
go(i,,nm)as1=max(as1,w[s[i]]*w[s[]]);
go(i,,nm)s[i]=(s[i-]+w[s[i]])%mod;
go(i,,nm)as2=(as2+(s[i]-s[i-])*s[i-])%mod;
}
int main()
{
n=read();
go(i,,n-){Rg int u=read(),v=read();add(u,v);add(v,u);}
go(i,,n)w[i]=read();
dfs(,);
printf("%d %d\n",as1,as2*%mod);
return ;
}

随机推荐

  1. HZOJ string

    正解炸了…… 考试的时候想到了正解,非常高兴的打出来了线段树,又调了好长时间,对拍了一下发现除了非常大的点跑的有点慢外其他还行.因为复杂度算着有点高…… 最后正解死于常数太大……旁边的lyl用同样的算 ...

  2. Python 2.X 版本 600行入门基础

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. 根据User Agent参数的各个字段Mozilla/5.0/4.0-AppleWebKit/Chrome/Safari/Firefox/Opera/MSIE来确定/判断客户端使用什么浏览器

    下面给你一一解答以及给你介绍: //Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like ...

  4. LRJ-Example-06-01-Uva210

    #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstdlib> #include <cstrin ...

  5. C++高精度加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  6. 使用提示(Hints)

    对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FRO ...

  7. 程序中打开IE浏览器并访问指定地址

    最简单的方法 Process.Start("iexplore.exe");  //直接打开IE浏览器(打开默认首页)            Process.Start(" ...

  8. Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件

    本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...

  9. java io流与序列化反序列化

    java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入 ...

  10. spring security自定义指南

    序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...