lgoj p1351 聯合權值
一看到我們就要反應出來:g是一顆樹。
兩個點的距離為2,就能產生聯合權值?
那我列舉中間點不就好了2333
乙個中間點的最大聯合權值就是它所連的點中權值最大的兩個點(如果它所連只有乙個點,自然不產生權值)。考慮它的所有的聯合權值之和怎麼算
第k
kk個點為中間點的所有聯合權值之和
a ns
[k]=
∑vi∑
vj!=
viw[
vi]∗
w[vj
]ans[k]=\sum_\sum_w[v_i]*w[v_j]
ans[k]
=vi
∑vj
!=v
i∑
w[vi
]∗w
[vj
]其中vi,
vj
v_i,v_j
vi,vj
是kk
k所連的點
繼續變形,得
a ns
[k]=
∑viw
[vi]
∗∑vj
!=vi
w[vj
]ans[k]=\sum_w[v_i]*\sum_w[v_j]
ans[k]
=vi
∑w[
vi]
∗vj
!=vi
∑w
[vj]=∑
viw[
vi]∗
(∑vj
w[vj
]−w[
vi])
=\sum_w[v_i]*(\sum_w[v_j]-w[v_i])
=vi∑
w[vi
]∗(
vj∑
w[v
j]−
w[vi
])=∑v
iw[v
i]∑v
jw[v
j]−∑
viw2
[vi]
=\sum_w[v_i]\sum_w[v_j]-\sum_w^2[v_i]
=vi∑
w[vi
]vj
∑w
[vj
]−vi
∑w
2[vi
]= (∑
viw[
vi])
2−∑v
iw2[
vi
]=(\sum_w[v_i])^2-\sum_w^2[v_i]
=(vi∑
w[v
i])
2−vi
∑w
2[vi
]so,我們只要求出與k
kk相鄰的點的權值和sum
sumsu
m與權值的平方和qsu
mqsum
qsum
,其所產生的聯合權值之和就為sum
2−qs
um
sum^2-qsum
sum2−q
sumnice!
#define usefasterread 1
#define rg register
#define inl inline
#define debug printf("[passing [%s] in line %d.]\n", __func__, __line__)
#define putline putchar('\n')
#define putsp putchar(' ')
#define rep(a, s, t) for(rg int a = s; a <= t; a++)
#define repdown(a, t, s) for(rg int a = t; a >= s; a--)
typedef
long
long ll;
#include
#define rs freopen("test.in", "r", stdin), freopen("test.out", "w", stdout)
#if usefasterread
char in[
1<<20]
,*ss = in,
*tt = in;
#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)
#endif
struct io
template
<
typename t>
inline io r
(t& x)
const
template
<
typename t>
inline io w
(t x)
const
if(x >=10)
w(x /10)
;putchar
(x %10+
'0')
;return
*this;}
template
<
typename t>
inline io wl
(const t& x)
const
template
<
typename t>
inline io ws
(const t& x)
const
inline io l()
inline io s()
}io;
template
<
typename t>
inline t max
(const t& x,
const t& y)
template
<
typename t>
inline t min
(const t& x,
const t& y)
template
<
typename t>
inline
void
swap
(t& x, t& y)
const
int maxn =
200005
;const
int mo =
10007
;int n;
struct edge e[maxn *2]
;int head[maxn]
, cnt;
void
addedge
(int u,
int v)
ll w[maxn]
;ll anssum;
ll ans;
intmain()
for(rg int i =
1; i <= n; i++
) io.
r(w[i]);
for(rg int i =
1; i <= n; i++)}
io.ws(ans).wl
(anssum)
;return0;
}
NOIP2014提高組 聯合權值
傳送門 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wu wv的聯合權值。請問圖 g 上所有...
NOIp提高組2014 聯合權值 dp 貪心
題解 本題主要考查dp 貪心。簡要題意 一棵樹,編號為i ii的點的權值為w iw i wi 每條邊的長度均為1 11。對於圖g gg上的點對 u,v u,v u,v 若它們的距離為2 22,則它們之間會產生wv wu w v times w u wv wu 的聯合權值。求最大的聯合權值和聯合權值總...
NOIP2014 聯合權值
鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...