美團CODEM 黑白樹 思維,拓撲DP

2021-08-03 06:06:09 字數 1534 閱讀 4512

時間限制:1秒

空間限制:32768k

一棵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變黑

輸出描述:

乙個數表示最少操作次數

輸入例子:

4 1

2 1

1 2 2 1

輸出例子:

3解法:現場忘記打了。。。基本思路就是染色是向上染色,那麼我們肯定要將所有的葉子節點進行染色,那麼這裡就是乙個dag圖了,直接用拓撲排序來模擬每一次都選擇度為0的點。但是這樣顯然是不對的,因為節點還有個k存在,舉個栗子,8->7->6->5->4->3->2->1 並且k的大小為4 10 2 2 1 1 1 1。我們直接按照拓撲序去模擬的話得到的答案是5,但是正確答案是2.我們維護乙個pre[i]代表染色到點i,以上乙個起點開始染色帶現在能剩餘的長度。那麼當pre[i]==0的時候,我們需要乙個點要麼是節點i,要麼是以上乙個起點到i這條鍊子上的某個點作為起點,繼續向下跑。我們還需要另外乙個陣列dp[i].表示跑到點i,以某乙個點作為起點,這條鍊子上跑到節點i還剩餘能夠染色的最長的長度。上面的樣例就是跑到4的時候pre[i]=0,但是這個時候的dp[i]=7,a[i]=1,我們選擇以7為最大長度繼續跑下去。這個題主要考察的是思維,好題。

#include 

using

namespace

std;

const

int maxn = 100010;

int n, ans, du[maxn], dp[maxn], a[maxn], pre[maxn];

vector

g[maxn];

void topsort()

}while(!q.empty())

for(int i = 0; iint v = g[u][i];

dp[v] = max(dp[v], dp[u]-1);

pre[v] = max(pre[v], pre[u]-1);

du[v]--;

if(du[v]==0)}}

}int main()

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

topsort();

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

return

0;}

美團CodeM初賽B輪 黑白樹 樹形結構貪心

一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上 包括節點i與根 所有與節點i距離小於k i 的點都會...

美團codeM預賽A 倒水

倒水 時間限制 1秒 空間限制 32768k 有乙個大水缸,裡面水的溫度為t單位,體積為c公升。另有n杯水 假設每個杯子的容量是無限的 每杯水的溫度為t i 單位,體積為c i 公升。現在要把大水缸的水倒入n杯水中,使得n杯水的溫度相同,請問這可能嗎?並求出可行的最高溫度,保留4位小數。注意 一杯溫...

美團CODEM 字串

時間限制 1秒 空間限制 32768k 給出乙個正整數n,我們把1.n在k進製下的表示連起來記為s n,k 例如s 16,16 123456789abcdef10,s 5,2 11011100101。現在對於給定的n和字串t,我們想知道是否存在乙個k 2 k 16 使得t是s n,k 的子串。輸入描...