洛谷 1351 聯合權值

2021-09-02 02:16:17 字數 1938 閱讀 9007

一棵樹上距離為2的兩個節點的權值相乘,問max和sum70分:列舉每個節點,它的兩個兒子必定距離為2,相加、取max即可(會t)

100分:注意到,乙個節點的兒子中,互相都要乘

根據乘法分配律,我先預處理它兒子的權值和,每個節點x對聯合權值的貢獻為key[x] * (sum - key[x])

這樣可以把o(\(\ n3\))的時間複雜度降至o(\( n2\))(70分**)最後sum要*2

#include

#include

#define maxn 200005

#define mo 10007

#define inf 0x3f3f3f3f

using

namespace std;

struct nodee[maxn <<1]

;int n, tot, head[maxn]

, key[maxn]

;void

addedge

(int u,

int v)

; head[u]

= tot;

e[++tot]

=(node)

; head[v]

= tot;

}int

main()

for(

int i =

1; i <= n; i++

)scanf

("%d"

,&key[i]);

long

long sum =0;

int maxkey =

-inf;

for(

int i =

1; i <= n; i++)}

}printf

("%d %lld\n"

, maxkey, sum *

2% mo)

;return0;

}

100分**
#include

#include

#define maxn 200005

#define mo 10007

#define inf 0x3f3f3f3f

using

namespace std;

struct nodee[maxn <<1]

;int n, tot, head[maxn]

, key[maxn]

;void

addedge

(int u,

int v)

; head[u]

= tot;

e[++tot]

=(node)

; head[v]

= tot;

}int

main()

for(

int i =

1; i <= n; i++

)scanf

("%d"

,&key[i]);

/*long long sum = 0; int maxkey = -inf; getting sum/max for 70 points

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

} }*/

long

long certain_sum, sum =0;

int maxkey =

-inf;

for(

int i =

1; i <= n; i++

) maxkey =

max(maxkey, tmp1 * tmp2)

;for

(int u = head[i]

; u; u = e[u]

.next)

}printf

("%d %lld\n"

, maxkey, sum % mo)

;return0;

}//

洛谷 1351 聯合權值

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

洛谷 1351 聯合權值

無向連通圖 gg 有 nn 個點,n 1n 1 條邊。點從 11 到 nn 依次編號,編號為 ii 的點的權值為 w iwi 每條邊的長度均為 11。圖上兩點 u,v u,v 的距離定義為 uu 點到 vv 點的最短距離。對於圖 gg 上的點對 u,v u,v 若它們的距離為 22,則它們之間會產生...

洛谷 1351 聯合權值

題解 每個點維護各個兒子的前字尾最大值 權值和,這樣就可以統計兒子之間相乘的答案。然後每個節點再乘它的祖父的權值去更新答案即可。1 include2 include3 include4 define ll long long 5 define rg register 6 define n 20001...