想象一下 imagine

2021-09-10 22:31:19 字數 1653 閱讀 6053

我們高大的老班舉起了有半個他那麼高的三角板,說:「你們想象一下——」

於是你就陷入了想象……

有一棵n個點的樹,每個葉子節點上都有乙個人,他們按照每秒鐘走一條邊的速度向樹根(節點1)前進。

你可以運用k次想象之力,讓某乙個節點(除了根節點)上的所有人瞬間(耗時為0)轉移到這個節點的父親上。

你想知道最少需要多少時間,所有人可以到達根節點。

輸入的第一行包含兩個整數n,k,含義見問題描述。

接下來n-1行,第i行乙個整數fai,表示節點i的父親為fai。

輸出一行乙個整數,表示所有人到達根節點最少需要的時間。

【樣例1輸入】

6 2122

24【樣例2輸入】

3 21

2

【樣例1輸出】

1【樣例2輸出】

0

【樣例1說明】

一開始,在節點3,5,6上分別有乙個人,我們稱他們為a,b,c。

時刻0,在節點6運用想象之力,a到達節點4。

第1秒,a,b,c走到節點2。

時刻1,在節點2運用想象之力,a,b,c到達節點1,即目的地。

共用時1秒。

【樣例2說明】

一開始只有節點3上有乙個人。

時刻0,在節點3運用想象之力,這個人到達節點2;

此時仍然為時刻0,在節點2運用想象之力,這個人到達節點1。

【子任務】

測試點 n

k特殊性質 1

≤8

無 2~4

≤100

5~8≤3000 9

≤500000 =1

10

樹是一條鏈

11~20 無

solution

考場時的想法:答案是有單調性的,那我二分乙個mid,然後把所有點往上跳mid步

在用樹形dp看看是否合法

效率o(nlog2) 90分

然而這題有o(n)做法

貪心把所有葉子往上跳,如果剩下的邊不足k條,就break

因為想象應該越晚用越好(一次拉多個)

好吧說實話我也不太會證

1.乙個節點最多隻會使用1次想象之力(當最後乙個人經過它的時候)

2.對於乙個人來說,對他用的想象之力一定越靠近根越好(盡可能多的與其它點共用)。

#include#include#include#include#include#include#include#define maxn 500005

using namespace std;

int n,k,f[maxn],flag[maxn],s[maxn],ans;

struct node;

queueq;

int main()

for(int i=1;i<=n;i++)if(!s[i])q.push(node);

int sum=n-1;if(k==sum)

while(!q.empty())

s[f[a.x]]--;

if(!s[f[a.x]])

}cout<

posted @

2018-10-23 19:13

liankewei 閱讀(

...)

編輯收藏

說一下Docker 一

對於提高伺服器的效能,支援輕量級的虛擬,實現開發測試上線的高度一致,團隊開發環境的協調統一,docker表現得極為出色。在功能上,我們將docker理解為乙個超輕量級的虛擬機器,它比vmware占用的資源少很多,執行速度快很多,因為它們的底層實現技術完全不同。docker就像乙個模具,我們能在作業系...

感慨一下,OI ACM

今天瞎逛幾個國內的online judge,在pku的rank list上看到大學隔壁宿舍一哥們的id。頓生景仰之情啊,我靠。rank 13,solved 1538 很有感慨,自己整個大學都沒有去參加acm,可能也是高中的oi讓我很不爽。回想一下當年自己高三上學期的時候,整天泡在學校機房,當時是做 ...

梳理一下思路

編譯器 將各個子程式裝配到一起的程式。作業系統 硬體擴充套件指令集 資源管理器。所有的程式都是在它們之上建立起來,所以需要理解它們。並且高質量的實現它們,為了讓我們有乙個更好的向前邁進的基礎,我們必須這麼做。所以先易後難,首先實現乙個作業系統的核,敬請各位留意最近計畫。既然子程式的運用有助於 的重用...