NOIP 2014 聯合權值

2022-08-19 22:21:14 字數 1234 閱讀 7498

 題目大意:

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

 邊無權, 所以節點i, j只有兩種關係可以有聯合權值:

 1. 爺爺與孫子( i( 或j) 的父節點的父節點是j( 或i) )

 2. 兄弟( i, j擁有共同的父節點)

 對於30%的資料可用floyd, 列舉任意的有序點對, 距離為2即

有聯合權值。

 對於60%的資料就隨便選乙個節點當根, 然後按照上面的兩個條件做就行了。

這道題提供兩種方法:

 方法一

 注意到n個點n-1條邊, 說明了這是一棵樹, 每兩個點之間只有一條路徑, 因為距離為2,這一條路徑必定經過乙個點, 而這兩個點在這乙個點的左右。

 那麼思路來了, 我們可以列舉中間的乙個點, 然後列舉它所連到的另外兩個點, 去最大值和第二大值, 可以用鄰接表( vector) 來實現。

 怎麼求和最好呢? 假設乙個點與a,b,c相連.那麼和就是a * b + a * c + b * a + b * c + c *a + c * b = a * (b + c) + b * (a + c) + c * (a + b),可以注意到這是乙個對稱式, a,b,c是不能化簡得, 那麼後一項發現是總的和減去前一項, 那麼演算法就出來了, 設o = a + b + c,那麼sum = a * (o - a) + b * (o - b) + c * (o - c), 不過注意到和需要取餘, 取餘的乙個技巧, 凡是結果可能大於mod的數就取餘, 此題還有乙個坑點就是權值可能就是負數, 那麼就要加上mod再取餘.

 方法2

 列舉每乙個點, 則與其相鄰的點互為距離為2的點。 該部分的最大值為點權最大的兩個

點的積, 所求的和為所有點的權值之和的平方減去每個點的平方, 這樣每條邊都被跑了兩次, 複雜度為o(n)。

送上ac**:

#includeconst int mo=10007,m=200008;

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

void add(int x,int y)

int main()

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

sum=max1*max2;

if (sum>ans) ans=sum;

}printf("%d %d\n",ans,tot);

return 0;

}

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...