一棵樹上距離為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...