時間限制: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 的子串。輸入描...