首先這是棵樹,那麼任意兩點間就只有一條路徑。要想值為2,那麼就需要兩個點連到同乙個點,即與同乙個點直接相連
那麼我們就可以列舉中間的點,然後遍歷它所有與其相連的點。
另外總和權值可以這麼算:
假如有兩個點:2ab
=(a+
b)2−
(a2+
b2)2ab=(a+b)^2-(a^2+b^2)
2ab=(a
+b)2
−(a2
+b2)
假如有三個點:2ab
+2ac
+2bc
=(a+
b+c)
2−(a
2+b2
+c2)
2ab+2ac+2bc=(a+b+c)^2-(a^2+b^2+c^2)
2ab+2a
c+2b
c=(a
+b+c
)2−(
a2+b
2+c2
) …
\dots
… n
nn個點:ans
=(∑w
i)2−
∑wi2
ans=(\sum w_i)^2-\sum w_i^2
ans=(∑
wi)
2−∑w
i2最大權值可以求出最大點權和次大點權,然後與答案比較一下就可以了
ps:只有總和要sro%orz,最大值不用sro%orz
#include
#include
#define p 10007
#define ll long long
using
namespace std;
struct node
map[
400005];
int n,x,y,tot;
ll mx,mx1,mx2,ans,sum,a[
200005];
void
add(
int x,
int y)
intmain()
for(
int i=
1;i<=n;
++i)
scanf
("%lld"
,&a[i]);
for(
int i=
1;i<=n;
++i)
ans+
=sum*sum;
mx=max(mx,mx1*mx2);}
printf
("%lld %lld\n"
,mx,ans%p)
;return0;
}
NOIP2014day1之聯合權值
noip2014day1有個題目叫聯合權值 題目描述 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為wi 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會...
NOIP2014 Day1 T2 聯合權值
noip2014 day1 t2 聯合權值 time limit 10000ms memory limit 131072k total submit 57 accepted 30 case time limit 1000ms description input output sample input...
NOIP 2014 day 1 T2 聯合權值
第一眼看起來很複雜。所以我想了個對鏈 和樹不同情況都分別處理的演算法。orz。複雜度太高最後4組t了。所以。轉換思路。聯合權值 w i w j i,j距離為2.也就是i,j中間間隔了乙個節點,所以我們在遍歷這個中間節點的時候處理。題目求最大和總和,先考慮最大,我們只需要對節點u維護乙個 max1,m...