NOIP2014 聯合權值 題解

2022-07-13 19:54:08 字數 1234 閱讀 9896

題目大意:

有一棵樹,求距離為2的點權的乘積的和以及最大值。

思路:

列舉每乙個點,則與其相鄰的點互為距離為2的點。該部分的最大值為點權最大的兩個點的積,和為點的權值和的平方減去每個點的平方,這樣每條邊都被跑了兩次,所以複雜度為o(n)。

用鄰接表儲存要開雙倍陣列(無向),當然像cyk大神一樣直接跑邊就不用考慮這個了。

**:

鄰接表:

1 #include2

const

int mo=10007,m=200008;3

int cnt,x,y,n,i,ans,tot,w[m],v[m<<1],last[m<<1],head[m<<1];4

5void add(int x,int y) 67

intmain()

823 tot=(tot+sum*sum)%mo;

24 sum=max1*max2;

25if (sum>ans) ans=sum;26}

27 printf("

%d %d\n

",ans,tot);

28return0;

29 }

%%%cyk大神:

1 #include2

using

namespace

std;

3int i,n,maxx,ans,x[200005],y[200005],w[200005];4

int am[200005],am2[200005],s[200005],qs[200005];5

intmain()617

else

if (w[y[i]]>am2[x[i]]) am2[x[i]]=w[y[i]];

18if (w[x[i]]>am[y[i]])

19else

if (w[x[i]]>am2[y[i]]) am2[y[i]]=w[x[i]];20}

21 maxx=0;22

for (i=1;i<=n;i++) maxx=max(maxx,am[i]*am2[i]);

23 ans=0;24

for (i=1;i<=n;i++) ans=(ans+s[i]*s[i]-qs[i])%10007

;25 cout<'

'<26 }

NOIP2014 聯合權值

鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...

NOIP 2014 聯合權值

評測傳送 70分 列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。可能退化為n 2 100分 在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum i 表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 sum i...

(noip2014)聯合權值

題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...