金華邀請賽 B題 poj 4045

2021-06-07 14:27:34 字數 1179 閱讀 2523

昨晚沒能把這題a掉,很懊悔,且不管什麼樹形dp,只要dfs水平過硬,這題也就變成水的了。大神們都說是比較簡單但是卻是比較經典的樹形dp,還有用兩次dfs掃瞄全樹就行。賽後請教了孟神,才明白就是這麼個樣。重新打了**,t了兩次,就a了。

題意:n個點之間有n-1條邊相連,形成一棵樹,在這n個點上選乙個點建乙個發電站,要求該發電站到所有點的代價總和最小,每乙個點到發電站的代價為i*i*r*d,d為該點到發電站的距離(每條邊的權值均視為1)。

題目分析:dfs1掃瞄並算出樹中每個節點有多少個孩子,dfs2重下往上算出子節點到根節點的花費代價,dfs3從上往下掃瞄,算出根到節點花費的代價,加起來就可以了,,,太深,,,腦子還不夠靈活我,做的時候我老想乙個dfs解決問題,最終失敗。

#include #include #include #include #include #include using namespace std;

const int maxn=50005;

int child[maxn];

long long val[maxn];

int vis[maxn];

int n,m,k;

vectormp[maxn];

void init()

void dfs_1(int u)

}}void dfs_2(int u)

}}void dfs_3(int u)

}}int main()

dfs_1(1);//算出直接和間接孩子總個數

// for(int i=1;i<=n;i++)

// cout

dfs_2(1);//可以求根的代價//重下往上算

// cout

dfs_3(1);//從上往下算出每個節點的代價

// for(int i=1;i<=n;i++)

// cout

for(int i=1;i<=n;i++)

printf("%lld\n",ans*m*m*k);

for(int i=1;i<=n;i++)

cout<}

return 0;

}

鞍山邀請賽 部分題

題意 給你n個行星,移動k個行星,繞他們的質心速度變得更大,使得這些行星的速度變得更大,那麼就要使得 i的值更小即可,include include include includeusing namespace std double zb 70100 double sum 70005 double ...

計蒜客 2019 南昌邀請賽 B題

題解 拉格朗日插值裸題 2019 icpc南昌區域賽 b題 includeusing namespace std typedef long long ll mod一定要是質數 const int mod 9999991 int pv 2000 前幾項,前面無效值用0佔位 int st 1,ed 使用...

2018南昌邀請賽網路賽d題

剛開始看到此提時也沒想到dp 但是仔細一思考可以發現確實是 我們只要單獨處理第一位數 剩下的符號和數字看成乙個物品 進行類似揹包的dp即可 首先預處理所有火柴和符號 根據輸入的總火柴進行一次dp即可 include include include includeusing namespace std...