NOIP 2014TG 联合权值

博客围绕一道题展开,主要思路是推公式,得出(元素的和的平方)等于(元素的平方和)加(两倍各元素两两相乘),之后枚举中间点,同时要特判自己不与自己连接。原题地址为https://www.luogu.org/problemnew/show/P1351 。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题地址 https://www.luogu.org/problemnew/show/P1351

主要思路:推公式

这里写图片描述

由上图得到(元素的和的平方)等于(元素的平方和)加(两倍各元素两两相乘)

然后枚举中间点,特判自己不与自己连接

#include <iostream>
#include <fstream>
#include <cstdio>
#include <string.h>
#define mod_base 10007
using namespace std;
const int maxn = 200001;
const int maxm = maxn*2;
const unsigned long long int INF = 2002102002;
int qread() {
    int x=0;
    char ch=getchar();
    while (ch>'9'||ch<'0')ch=getchar();
    while (ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x;
}
int n,en=0,head[maxn],w[maxn],x,y;
 long long int ans_s=0,pw_s,s_pw,ans_maxs=0,maxw=0,ans_maxw=0;
struct edge {
    int fr,gt,nxt;
};
edge e [maxm];
void adg(int x,int y) {
    ++en;
    e[en].fr=x;
    e[en].gt=y;
    e[en].nxt=head[x];
    head[x]=en;
}
int main() {
    //freopen ("1351.in","r",stdin);
    //freopen ("1351.out","w",stdout);
    n=qread();
    memset(head,0,sizeof(head));
    for (int i=1; i<n; i++) {
        x=qread();
        y=qread();
        adg(x,y);
        adg(y,x);
    }
    for (int i=1; i<=n; i++)w[i]=qread();
    for (int i=1; i<=n; i++) {
        maxw=0;
        s_pw=pw_s=0;
        int js=0;
        //cout<<i<<' ';
        for (int j=head[i]; j; j=e[j].nxt) {
            ++js;
            //cout<<e[j].gt<<' ';
            pw_s=((w[e[j].gt]*w[e[j].gt])+pw_s) % mod_base;
            //  cout<<w[e[j].gt]<<' '<<pw_s;
            s_pw=(s_pw+w[e[j].gt])%mod_base;
            if(maxw*w[e[j].gt]>ans_maxw)ans_maxw=maxw*w[e[j].gt];

            if(w[e[j].gt]>maxw)maxw=w[e[j].gt];
            //cout<<w[e[j].gt]<<' '<<maxw<<endl;
        }
        if(js>1)ans_s=(ans_s+(s_pw*s_pw-pw_s)) % mod_base;
        //cout<<pw_s;
        //cout<<endl;
    }
    cout<<ans_maxw<<' '<<ans_s<<endl;
    fclose (stdin);
    fclose (stdout);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值