P1351 [NOIP2014 提高组] 联合权值
题解
我一开始想遍历每一个点,然后求出能和它配对的点的权值,但是参考菊花图,这样的速度太慢,所以考虑用一个点表示多个配对,于是发现每个点都可以作为配对的中间点
code
#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
int a[200005];
vector<int> G[200005];
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0,maxs=0;
for(int i=1;i<=n;i++)
{
int max1=0,max2=0,sum1=0,sum2=0;
for(auto next:G[i])
{
sum1+=a[next];
sum1%=mod;
sum2+=(a[next]*a[next])%mod;
sum2%=mod;
if(a[next]>=max1)
{
max2=max1;
max1=a[next];
}
else if(a[next]>max2)
{
max2=a[next];
}
}
ans+=sum1*sum1%mod-sum2+mod;
ans%=mod;
maxs=max(maxs,max1*max2);
}
cout<<maxs<<" "<<ans;
return 0;
}

浙公网安备 33010602011771号