評測傳送
70分:列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。(可能退化為n^2)
100分:在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum[i]表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 (sum[i]-w[j])*w[j]。
最大值則用兩個陣列來記 i 的鄰接點的權值的最大值和次大值。時間複雜度o(4*n)
70分
#include//o(n^2)
#include
#include
#include
#include
#include
const
int n=200009;
const
int mod=10007;
using
namespace
std;
int n,w[n],ans,maxn;
//int head[n],nxt[2*n],to[2*n],tot;
vector
t[n];
void add(int x,int y)
int main()
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=n;i++)
}printf("%d %d",maxn,ans);
//printf("\n%d",clock());
return
0;}
100分
#include//o(4*n)
#include
#include
#include
#include
#include
#define ll long long
const
int n=200009;
const
int mod=10007;
using
namespace
std;
int n,maxn,m1[n],m2[n];
int head[n],nxt[2*n],to[2*n],tot,f[n];
bool vis[n];
int sum[n],w[n],ans;
void add(int x,int y)
int main()
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=n;i++)
} for(int i=1;i<=n;i++)
maxn=max(maxn,m1[i]*m2[i]);
}printf("%d %d",maxn,ans);
//printf("\n%d",clock());
return
0;}
NOIP2014 聯合權值
鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...
(noip2014)聯合權值
題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...
NOIP 2014 聯合權值
無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中...