一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k[i]。每個點都有乙個顏色,初始的時候所有點都是白色的。
你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上(包括節點i與根)所有與節點i距離小於k[i]的點都會變黑,已經是黑的點保持為黑。問最少使用幾次操作能把整棵樹變黑。
輸入描述:
第一行乙個整數n (1 ≤ n ≤ 10^5)接下來n-1行,每行乙個整數,依次為2號點到n號點父親的編號。
最後一行n個整數為k[i] (1 ≤ k[i] ≤ 10^5)
樣例解釋:
對節點3操作,導致節點2與節點3變黑
對節點4操作,導致節點4變黑
對節點1操作,導致節點1變黑
輸出描述:
乙個數表示最少操作次數
輸入例子1:
41211 2 2 1
輸出例子1:
3
思路:貪心策咯。可以無視必須選擇白色葉子進行染色,因為可以先更新樹的分支節點,然後再更新葉節點。還會分析得葉子節點必染。做法就是從葉節點貪心地向上更新,維護乙個通過當前點及其所有子孫節點能夠到達的最小的深度的陣列,再維護乙個染色某個節點及其所有子孫節點後能夠保持到的最小的深度的陣列(用於和當前節點深度進行比較判斷是否增加染色點)。複雜度為o(n)。
code:
#include using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
vectore[maxn];
int k[maxn], deep[maxn], f[maxn], p[maxn];
int n, ans;
void dfs(int x)
if(p[x] > deep[x]) }
int main()
for(int i = 1; i <= n; ++i) scanf("%d", &k[i]);
deep[1] = 1; ans = 0;
dfs(1);
printf("%d\n", ans);
return 0;
}
繼續加油~
2018美團CodeM程式設計大賽初賽B輪 A題開關燈
美團的辦公室一共有n層,每層有m個會議室,可以看成是乙個n m的網格圖。工程師們每天的工作需要協作的地方很多,經常要到會議室開會解決各種問題。公司是提倡勤儉節約的,因此每次會議室只在使用時才開燈。當乙個工程師進入會議室時,假設沒有其他人,他會把燈開啟。當乙個工程師離開會議室時,假設沒有其他人,他會把...
美團CODEM 黑白樹 思維,拓撲DP
時間限制 1秒 空間限制 32768k 一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上 包括節點i與...
CodeM美團 初賽A輪 A題 身體訓練
美團外賣的配送員用變速跑的方式進行身體訓練。他們訓練的方式是 n個人排成一列跑步,前後兩人之間相隔 u 公尺,每個人正常速度均為 v 公尺 秒。當某個配送員排在最後的時候,他需要以當時自己的最高速度往前跑,直到超過排頭的人 u 公尺,然後降回到原始速度 v 公尺 秒。每個人最初的最高速度為c i 公...