题目地址
https://www.luogu.org/problemnew/show/P1351
这个题思路其实并不难想,题面也很容易理解。
一(cuo)开(wu)始的思路是,可以先枚举每个点,在通过该点所能到达的点去寻找与其组队的点,用maxx维护最大值,ans记录总和,
当然,这个思路本身是没有错误的,但是看一下数据范围就知道肯定会tle,因为是考试,本身就是奔着那60分去的。。。。
#include<cstdio>
#include<iostream>
using namespace std;
int w[],k,n,head[],ans,maxx=-0x6ffffff;
struct node{
int u,v,nxt;
}a[];
void add(int x,int y)
{
a[++k].u=x,a[k].v=y;
a[k].nxt=head[x];
head[x]=k;
}
int main()
{
scanf("%d",&n);
for(int i=,x,y;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=n;++i)
{
scanf("%d",&w[i]);
}
for(int i=;i<=n;++i)
{
int sum=,max2=,max1=;
for(int j=head[i];j;j=a[j].nxt)
{ if(w[a[j].v]>max1)
{
max2=max1;
max1=w[a[j].v];
}
else if(w[a[j].v]>max2)
max2=w[a[j].v];
ans=(ans+w[a[j].v]*sum)%;
sum=(sum+w[a[j].v])%;
}
maxx=max(maxx,max1*max2);
}
printf("%d %d",maxx,(ans*)%);
return ;
}