NOIP提高組2014 聯合權值 解題報告

2021-09-26 06:14:29 字數 3655 閱讀 3398

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...