P1351 聯合權值

2022-07-20 04:48:11 字數 2588 閱讀 6423

題意:

無向連通圖 g 有 n 個點,n−1 條邊。

點從 1 到 n 依次編號,編號為 i 的點的權值為 $w_i$ ,每條邊的長度均為 1。

圖上兩點 (u,v) 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 (u,v),若它們的距離為 2,則它們之間會產生$w_v*w_u$ 的聯合權值。

請問圖 g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?

權值和的結果對10007取模

首先,暴力。。。對每個點爆搜,限制dep=2,統計答案

//

暴力70分~~~~~~~~~~~~

#include#include

#include

#include

#include

#include

using

namespace

std;

#define int long long

#define olinr return

#define nmr 205050

#define _ 0

#define love_nmr 0

#define mod 10007

#define db double

intw[nmr];

vector

g[nmr];

intn;

inline

intread()

while

(isdigit(ch))

return x*f;

}inline

void put(int

x)

if(x>9

) put(x/10

); putchar(x%10+'0'

);}intans;

inttot;

inline

void dfs(int fir,int x,int fa,int

dep)

for(int i=0;i)

}signed main()

for(int i=1;i<=n;i++)

w[i]=read();

for(int i=1;i<=n;i++)

dfs(i,i,

0,0);

put(ans);

putchar(''

); put(tot);

olinr ~~(0^_^0)+love_nmr;

}

打完暴力交上去才發現,woc,(u,v)與(v,u)不等同!!

也就是說,統計權值和應該算兩次!而上面的暴力正好做到了qaq

正解。。。。。。666

因為長度為2,也就是3給點,我們列舉中間點,如圖,1,2,3,4,5,6任意組合都成立。。。

所以,對於每個點,直接列舉它直接相連的點,兩兩組合就行了qaq

對於權值和,比如我們進行到了4

那麼它可以與1,2,3,組合

權值和+=($4*1+4*2+4*3=(1+2+3)*4$)

額這可以用字首和。。。

所以,對每個點

維護乙個字首和

維護乙個字首最大值

最後別忘$*2$和取模就行了

#include#include

#include

#include

#include

#include

using

namespace

std;

#define int long long

#define olinr return

#define nmr 205050

#define _ 0

#define love_nmr 0

#define mod 10007

#define db double

intw[nmr];

vector

g[nmr];

intn;

ints[nmr];

intmaxx[nmr];

inline

intread()

while

(isdigit(ch))

return x*f;

}inline

void put(int

x)

if(x>9

) put(x/10

); putchar(x%10+'0'

);}intans;

inttot;

intcnt;

signed main()

for(int i=1;i<=n;i++)

w[i]=read();

for(int i=1;i<=n;i++)

}

put(ans);

putchar(''

); put((tot

<<1)%mod);

olinr ~~(0^_^0)+love_nmr;

}

P1351 聯合權值

無向連通圖g有n個點,n 1 條邊。點從1到n依次編號,編號為i的點的權值為w i 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu的聯合權值。請問圖 g上所有可產生聯合權值的有序點對中,聯...

P1351 聯合權值

然而這只是一道普及 提高的大水題 洛谷鏈結 這道題是2014年提高組day1的第二題。簡單題意就是在樹上每個點都有權值,相鄰兩點的距離為1,求距離為2的點的權值乘積的和以及最大值。基本思路就是遍歷整棵樹,然後找到距離該點距離為2的點,計算距離,更新最大值和乘積和。但這樣就很慢了。所以我們可以遍歷中間...

P1351 聯合權值

為了寫一寫lca,我就按照標籤找 結果這道題我寫完竟然沒用lca 真是神奇。很多人 包括我 首先就想到了要列舉每乙個點,再列舉任意這個點的兩個兒子,可是顯然o n2 會t 其實我們只要線性掃一遍就可以了,利用小學學到的乘法分配率,邊走邊加val,這樣下乙個點和val的乘積就是它和這之前所有的點的乘積...