NOIP 2014 聯合權值

2021-08-09 10:55:12 字數 1474 閱讀 7237

評測傳送

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 上所有可產生聯合權值的有序點對中...