我們高大的老班舉起了有半個他那麼高的三角板,說:「你們想象一下——」
於是你就陷入了想象……
有一棵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讓我很不爽。回想一下當年自己高三上學期的時候,整天泡在學校機房,當時是做 ...
梳理一下思路
編譯器 將各個子程式裝配到一起的程式。作業系統 硬體擴充套件指令集 資源管理器。所有的程式都是在它們之上建立起來,所以需要理解它們。並且高質量的實現它們,為了讓我們有乙個更好的向前邁進的基礎,我們必須這麼做。所以先易後難,首先實現乙個作業系統的核,敬請各位留意最近計畫。既然子程式的運用有助於 的重用...