【题解】LuoGu1351:联合权值

这道题分为两部分

求最大联合权值和求和

先想到:如果j,k是i的邻居,那么j,k距离为2,可以算联合权值

那么,最大联合权值是max{maxa[i]*maxb[i]}(1<=i<=n)

maxa,maxb表示最大的两个相邻权值

接下来求和

易知,一个点i,若有邻居的权值为a1,a2,a3,……,at,那么和为a1*(a2+a3+……+at)+a2*(a1+a3+……+at)+……+at*(a1+a2+……+a(t-1))

用代入法,设S=a1+a2+a3+……+at,那么和为S^2-a1^2-a2^2-a3^2-……-at^2

把每个点的S与(a1^2+a2^2+a3^2+……+at^2)存储起来,最终搞一下就好了

Code:

var
    maxa,maxb,sum,s,u,v,a:array[0..200000] of int64;
    i,n:longint;
    print,ans:int64;
begin
    readln(n);
    for i:=1 to n-1 do
        readln(u[i],v[i]);
    for i:=1 to n do
        read(a[i]);
    for i:=1 to n-1 do
        begin
            if a[u[i]]>maxa[v[i]] then
                begin
                    maxb[v[i]]:=maxa[v[i]];
                    maxa[v[i]]:=a[u[i]];
                end else
            if a[u[i]]>maxb[v[i]] then
                maxb[v[i]]:=a[u[i]];
            if a[v[i]]>maxa[u[i]] then
                begin
                    maxb[u[i]]:=maxa[u[i]];
                    maxa[u[i]]:=a[v[i]];
                end else
            if a[v[i]]>maxb[u[i]] then
                maxb[u[i]]:=a[v[i]];
            sum[u[i]]:=(sum[u[i]]+sqr(a[v[i]])) mod 10007;
            sum[v[i]]:=(sum[v[i]]+sqr(a[u[i]])) mod 10007;
            s[u[i]]:=(s[u[i]]+a[v[i]]) mod 10007;
            s[v[i]]:=(s[v[i]]+a[u[i]]) mod 10007;
        end;
    for i:=1 to n do
        if maxa[i]*maxb[i]>print then
            print:=maxa[i]*maxb[i];
    write(print,' ');
    for i:=1 to n do
        ans:=(ans+(sqr(s[i])-sum[i])) mod 10007;
    writeln(ans);
end.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值