$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. jmeter日期处理beanshell(2)

    import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.text.P ...

  2. 21Hash算法以及暴雪Hash

    一:哈希表简介 哈希表是一种查找效率极高的数据结构,理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内 ...

  3. PHP 7.0新增特性详解

    https://www.cnblogs.com/riverdubu/archive/2017/03/22/6434705.html 开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大 ...

  4. There is no getter for property named 'XXX' in 'class java.lang.String'

    实验环境:spring boot+mybitis 由于采用的不带映射xml文件的模式,因此 方法1: 把#{xxx}修改为 #{_parameter} 即可 select count(*) from ...

  5. avalon2 第一个demo

    <!DOCTYPE html> <html> <head> <title>TODO supply a title</title> <m ...

  6. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  7. 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321

    由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...

  8. jQuery签名插件jSignature

    1.引入jSignature.min.js和jquery.min.js文件2.代码 <div id="signature"></div> 3.js 初始化 ...

  9. spring json 返回中文乱码

    如前台显示的json数据中的中文为???,则可尝试以下方法. 方法一(推荐):在@RequestMapping中添加  produces={"text/html;charset=UTF-8; ...

  10. linux 位操作

    atomic_t 类型在进行整数算术时是不错的. 但是, 它无法工作的好, 当你需要以原子方 式操作单个位时. 为此, 内核提供了一套函数来原子地修改或测试单个位. 因为整个操作 在单步内发生, 没有 ...