$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. How to use AutoMapper

    http://docs.automapper.org/en/stable/Getting-started.html IMappingExpression<TSource, TDestinatio ...

  2. [MySQL]获取当月每一天

    常用使用场景: 统计某个月(某个时间区间)内每一天的数据量 select date_add(curdate(), interval(cast(help_topic_id as signed integ ...

  3. Streamy障碍一:大批量条目

  4. SDUT-3332&3333_数据结构实验之栈与队列五:下一较大值

    数据结构实验之栈与队列六:下一较大值 Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 对于包含n(1<=n<=1 ...

  5. Python深入:02浅拷贝深拷贝

    对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...

  6. @codeforces - 1096G@ Lucky Tickets

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知一个数(允许前导零)有 n 位(n 为偶数),并知道组成这个 ...

  7. 2019-5-27-C#-很少人知道的科技

    title author date CreateTime categories C# 很少人知道的科技 lindexi 2019-05-27 19:33:36 +0800 2018-03-16 08: ...

  8. 我去!JS的原型是咋回事?

    我去!JS的原型是咋回事? 最近写公司的项目,写着写着发现自己的原型的理解还是不够透彻,又去网上查了一番资料,顺便总结一下,在顺便给到的朋友能提供一点帮助.如有遗漏,欢迎交流. 原型是啥?为什么要用原 ...

  9. CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    记录下在CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)过程笔记. 工具 VMware版本号 : 12.0.0 CentOS版本 : 7.0 一.修改 ...

  10. Netty进行文件传输

    本次是利用TCP在客户端发送文件流,服务端就接收流,写入相应的文件. 实验的源文件是一个图片,假设地址是D:\\Koala.jpg,接收保存后的图片为D:\\test.jpg 原理就是将文件读取成by ...