P1351 聯合權值

2022-05-24 07:03:07 字數 882 閱讀 6384

為了寫一寫lca,我就按照標籤找……結果這道題我寫完竟然沒用lca……真是神奇。。。

很多人(包括我),首先就想到了要列舉每乙個點,再列舉任意這個點的兩個兒子,可是顯然o(n2)會t……

其實我們只要線性掃一遍就可以了,利用小學學到的乘法分配率,邊走邊加val,這樣下乙個點和val的乘積就是它和這之前所有的點的乘積之和,最後就是sum。

當然,點對反過來就是一組新的點對,所以,隨後的sum要乘2。

而對於最大值,只要每一次更新我掃過的這些點權裡最大的數是多少(在一次外層迴圈中),和新的點權相乘,看看能不能更新最大解即可。

對了,記得看看是給誰取模。

**如下:

#include#include

#include

#include

using

namespace

std;

#define maxn 4000000

#define mod 10007

#define int long long

inthead[maxn],to[maxn],nxt[maxn],w[maxn];

intn,cnt;

void add(int a,int

b)main()

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

scanf(

"%lld

",&w[i]);

int sum=0,max=0

;

intfir,val,maxpo;

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

}printf(

"%lld %lld

",max,(2*sum)%mod);

return0;

}

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 聯合權值

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