題目大意:
有一棵樹,求距離為2的點權的乘積的和以及最大值。
思路:
列舉每乙個點,則與其相鄰的點互為距離為2的點。該部分的最大值為點權最大的兩個點的積,和為點的權值和的平方減去每個點的平方,這樣每條邊都被跑了兩次,所以複雜度為o(n)。
用鄰接表儲存要開雙倍陣列(無向),當然像cyk大神一樣直接跑邊就不用考慮這個了。
**:
鄰接表:
1 #include2const
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 #include2using
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...