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;
}


posted @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示