【2020 特长生】星座图
题目
解题思路
哈哈,我一直在想确定一个点,走两步,怎么搞
确定一个点,ta的子节点间构成合法星座
在统计子节点时,顺带求出最大值和次大值,相乘与最终答案比较
求和时,直接累加所有子节点与ta的距离sum,然后自己乘sum-自己
代码
#include<iostream>
#include<cstdio>
using namespace std;
int x,y,n,t,ma,mi,maxn;
long long ans,sum;
int a[200010],b[200010],head[200010];
struct lzf{
int to,nxt;
}f[400010];
void add(int x,int y)
{
f[++t].to=y;
f[t].nxt=head[x];
head[x]=t;
}
int main()
{
freopen("link.in","r",stdin);
freopen("link.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
{
t=sum=0,ma=mi=0;
for (int j=head[i];j;j=f[j].nxt)
{
b[++t]=f[j].to;
sum+=a[b[t]];
if (a[b[t]]>ma) mi=ma,ma=a[b[t]];
else if (a[b[t]]>mi) mi=a[b[t]];
}
for (int j=1;j<=t;j++)
ans=(ans+a[b[j]]*(sum-a[b[j]])%10007)%10007;
maxn=max(ma*mi,maxn);
}
printf("%d %lld",maxn,ans);
return 0;
}