NOIP2014 D1T2 聯合權值

2021-08-10 00:19:13 字數 1322 閱讀 999

題目描述

無向連通圖g 有n 個點,n - 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i ,每條邊的長度均為1 。圖上兩點( u , v ) 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對( u, v) ,若它們的距離為2 ,則它們之間會產生wu×wv 的聯合權值。

請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?

這道題。。暴力10分鐘寫完70分。我樹形dp好弱啊。。

改了好久才ac。我們經觀察可以發現,對於可以聯合的兩個點,他們的關係只有兩種:爺孫關係或兄弟關係。

這裡的(1,3)(2,4)等點就是爺孫關係。而(6,7)為兄弟關係。對於爺孫關係的點,我們可以劃分狀態,以i為根的最大聯合權值與以以i為根的聯合權值和。可寫出。

爺孫關係:f最大【i】=max

f和【i】=σf【兒子】+σnum【自身】*孫子

兄弟關係:f最大【i】=最大兒子*次大兒子

f和=所有兒子兩兩排列的乘積。(我們可以只算一次再答案乘2)

**如下有注釋:

#include

using

namespace

std;

const

int maxn=200005;

const

int mod=10007;

struct edgee[maxn<<1];

long

long head[maxn],cnt=0,n,tem1,tem2,num[maxn],maxx=0,sumx=0;

long

long ezm[maxn]/*i的兒子的最大值 */,sumv[maxn],/*以i為根的聯合和*/maxsum[maxn]/*以i為根的聯合最大值。*/,sz[maxn]; //i的兒子點權值和

inline

void add(int u,int v),head[u]=cnt;}

void dfs(int u,int fa)

long

long tem=0,tem2=0;

for(int i=head[u];i;i=e[i].next)

}int main()

for(int i=1;i<=n;i++)scanf("%d",&num[i]);

dfs(1,1);

printf("%d %d\n",maxsum[1],(sumv[1]<<1)%mod);

return

0;}

noip2014 d1t2 聯合權值

感覺自己越來越弱了.題目鏈結 對於60 的資料,樸素列舉即可 對於100 的資料,考慮優化 我們注意到每條邊的長度均為1,而要求點對距離為2,可見和同乙個點有連邊的兩點之間就會產生權值 對於第一問,顯然可以貪心儲存最大和次大值從而避免n 的查詢 對於第二問,乙個講的清楚的 鏈結 記sum為與乙個結點...

NOIP2014 Day1 T2 聯合權值

noip2014 day1 t2 聯合權值 time limit 10000ms memory limit 131072k total submit 57 accepted 30 case time limit 1000ms description input output sample input...

NOIP 2014 day 1 T2 聯合權值

第一眼看起來很複雜。所以我想了個對鏈 和樹不同情況都分別處理的演算法。orz。複雜度太高最後4組t了。所以。轉換思路。聯合權值 w i w j i,j距離為2.也就是i,j中間間隔了乙個節點,所以我們在遍歷這個中間節點的時候處理。題目求最大和總和,先考慮最大,我們只需要對節點u維護乙個 max1,m...