無向連通圖 gg 有 nn 個點,n-1n−1 條邊。點從 11 到 nn 依次編號,編號為 ii 的點的權值為 w_iwi,每條邊的長度均為 11。圖上兩點 (u, v)(u,v) 的距離定義為 uu 點到 vv 點的最短距離。對於圖 gg 上的點對 (u, v)(u,v),若它們的距離為 22,則它們之間會產生w_v \times w_uwv×wu的聯合權值。
請問圖 gg 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
第一行包含 11 個整數 nn。
接下來 n-1n−1 行,每行包含 22 個用空格隔開的正整數 u,vu,v,表示編號為 uu 和編號為 vv 的點之間有邊相連。
最後 11 行,包含 nn 個正整數,每兩個正整數之間用乙個空格隔開,其中第 ii 個整數表示圖 gg 上編號為 ii 的點的權值為 w_iwi。
輸出共 11 行,包含 22 個整數,之間用乙個空格隔開,依次為圖 gg 上聯合權值的最大值和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對1000710007取餘。
輸入 #1複製
5輸出 #1複製1 2
2 33 4
4 5
1 5 2 3 10
本例輸入的圖如上所示,距離為2 的有序點對有( 1,3)(1,3) 、( 2,4)(2,4) 、( 3,1)(3,1) 、( 3,5)(3,5)、( 4,2)(4,2) 、( 5,3)(5,3)。
其聯合權值分別為2 、15、2 、20、15、20。其中最大的是20,總和為74。
【資料說明】
對於30%的資料,1 < n \leq 1001
對於60%的資料,1 < n \leq 20001
對於100%的資料,1 < n \leq 200000, 0 < w_i \leq 100001
保證一定存在可產生聯合權值的有序點對。
題解:暴力出奇蹟(由於資料較水,沒有被卡n^2)
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int mod=10007
;const
int n=200002
;struct
nodee[n*2
];int
cnt,head[n];
void add(int x,int
y)int
yc,v,ans;
intn,a[n],x,y;
void work(int
x)
else
if(a[v]>mx2)
ans=(ans+sum*a[v])%mod;
sum=(sum+a[v])%mod;
}yc=max(yc,mx1*mx2);
}int
main()
for(int i=1;i<=n;i++)
scanf("%d
",&a[i]);
for(int i=1;i<=n;i++) work(i);
printf(
"%d %d
",yc,(ans*2)%mod);
return0;
}
洛谷 1351 聯合權值
一棵樹上距離為2的兩個節點的權值相乘,問max和sum70分 列舉每個節點,它的兩個兒子必定距離為2,相加 取max即可 會t 100分 注意到,乙個節點的兒子中,互相都要乘 根據乘法分配律,我先預處理它兒子的權值和,每個節點x對聯合權值的貢獻為key x sum key x 這樣可以把o n3 的...
洛谷 1351 聯合權值
題目描述 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 iii 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu 的聯合權值。請問圖 g...
洛谷 1351 聯合權值
題解 每個點維護各個兒子的前字尾最大值 權值和,這樣就可以統計兒子之間相乘的答案。然後每個節點再乘它的祖父的權值去更新答案即可。1 include2 include3 include4 define ll long long 5 define rg register 6 define n 20001...