LOJ 10159 旅遊規劃 樹形DP

2021-09-11 19:38:49 字數 1408 閱讀 7838

題目描述

首先是求樹中最長鏈的問題,只需遍歷一遍,更新每個點距離的最大值和次大值,列舉一遍,記下答案ans。

如果此時暴搜的話,找出路徑為ans的邊上的點,是可以得出答案的,但會超時。我們可以根據記下的最大值以及次大值來找路徑,找出相加為ans的點,搜尋,如果搜到的子節點最大值為父節點最大值-1,那麼這個子節點就在最長的路徑上。

50分

#include#include#include#includeusing namespace std;

const int n=2e5+5;

int h[n],to[2*n],next[2*n],tot;

int d1[n],d2[n],an[n],st[n],ans,m;

bool fl[n];

void add(int x,int y)

void dp(int x,int fa)

}void dfs(int x,int fa,int step)

for(int i=h[x];i;i=next[i]) }

int main()

dp(0,0);

for(int i=0;i<=n-1;i++) ans=max(ans,d1[i]+d2[i]);

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

sort(an+1,an+m+1);

for(int i=1;i<=m;i++) printf("%d\n",an[i]);

return 0;

}

100分

#include#include#include#includeusing namespace std;

const int n=2e5+5;

int h[n],to[2*n],nxt[2*n],tot;

int d1[n],d2[n],an[n],st[n],ans,m;

bool fl[n];

void add(int x,int y)

void dp(int x,int fa)

}void work(int x,int fa,int len)

for(int i=h[x];i;i=nxt[i]) }

void dfs(int x,int fa)

for(int i=h[x];i;i=nxt[i]) }

int main()

dp(0,-1);

for(int i=0;i<=n-1;i++) ans=max(ans,d1[i]+d2[i]);

dfs(0,-1);

sort(an+1,an+m+1);

for(int i=1;i<=m;i++) printf("%d\n",an[i]);

return 0;

}

10 15解題報告

測 100 裸的spfa 裸得連讀入優化都不能打 表示不想打 哪怕只要複製 測 70 在考試的時候推出了只需要從前往後一步一步推而不需要考慮順序所以做出暴力 正解應該是用乙個類似於字首和的玩意讓區間的取反時間變為o 1 include include include include include ...

1015考試總結

先通覽一遍題面 第一題估計是數論,第二題估計是dp或者區間操作,第三題估計是資料結構 首先第一題最關鍵的性質是n n n m,也即是說可以一列一列的轉移,每隔n列個數相同 然後一開始想錯了,想成之後都是第一行個數 8 30碼完第一題第乙個版本 方法有問題 8 40碼完第一題第二個版本 暴力 對拍,發...

10 15考試反思

t1 衣服 首先這題很顯然是個貪心,我們考慮如何貪心。我們看顏色種類,最多只有四種,所以我們考慮開4個優先佇列,把所有衣服上的顏色都推到優先佇列裡,比如衣服1有123三個顏色,就把衣服1的價值推到編號為123的佇列中。然後將詢問離線,每次取當前這個所需要的顏色的隊首元素,然後對於這個衣服,我們拿過了...