您的位置:首页 > 其它

【NOIP2016提高A组模拟9.9】Crisis

2016-09-12 21:35 441 查看
Description

最近几年,一场新的金融危机爆发了,这场危机使得很多人陷入的经济问题的困境。一些X公司的员工试图通过要求加薪度过这一难关。

X公司有着严格的等级制度,除了公司所有者小H以外,其他人都有一个直属上司。没有下属的员工称为工人,其他人则称为领导者。

为了加薪,工人们都会向他们的上司提交请愿书。当然,每个领导者都希望自己的下属能够尽可能快乐的工作,所以当至少有T%的下属提交请愿书时,那么这个领导者就会向自己的上司提交请愿书。计算百分比时,领导者只会计算直属上司是他的下属,当然,他也只会提交一次请愿书。

如果最会小H收到了超过T%的请愿书,那么他将为所有工人们加薪。现在给出公司的构架和T的数值,你需要计算至少有多少工人提交请愿书才能使得小H给工人加薪。

Input

第一行N,T(1≤N≤100000,1≤T≤100)。N表示公司的总人数(不包括小H)。每个员工编号为1到N。小H编号为0 。

第二行有N数,第I个数表示编号的员工直属上司的编号。

Output

一个数,最小需求的工人数。

Sample Input

Cirsis1.in

3 100

0 0 0

Cirsis2.in

3 50

0 0 0

Cirsis3.in

14 60

0 0 1 1 2 2 2 5 7 5 7 5 7 5

Sample Output

Cirsis1.out

3

Cirsis2.out

2

Cirsis3.out

5

Data Constraint

1≤N≤100000,1≤T≤100

比赛时の想法

十分明显啊,树形dp,每次在儿子中取代价最小的几个就可以了

var
a,b:array[0..100005,1..2]of longint;
tree,size,cc:array[0..100005]of longint;
i,j,k,l,n,t:longint;
procedure qsort(l,r:longint);
var
tmp:array[1..2]of longint;
i,j,mid:longint;
begin
i:=l;
j:=r;
mid:=a[(i+j) div 2,1];
repeat
while a[i,1]<mid do inc(i);
while a[j,1]>mid do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
procedure star;
begin
b[a[1,1],1]:=1;
for i:=2 to n do
if a[i,1]<>a[i-1,1] then
begin
b[a[i-1,1],2]:=i-1;
b[a[i,1],1]:=i;
end;
b[a[n,1],2]:=n;
end;
procedure qsort1(l,r:longint);
var
i,j,mid:longint;
begin
i:=l;
j:=r;
mid:=cc[(i+j) div 2];
repeat
while cc[i]<mid do inc(i);
while cc[j]>mid do dec(j);
if i<=j then
begin
cc[0]:=cc[i];
cc[i]:=cc[j];
cc[j]:=cc[0];
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort1(i,r);
if l<j then qsort1(l,j);
end;
procedure dfs(x:longint);
var
i,cy:longint;
begin
if b[x,1]=0 then tree[x]:=1 else
begin
for i:=b[x,1] to b[x,2] do if i<>0 then dfs(a[i,2]);
for i:=b[x,1] to b[x,2] do cc[i-b[x,1]+1]:=tree[a[i,2]];
qsort1(1,size[x]);
cy:=0;
for i:=1 to size[x] do
begin
tree[x]:=tree[x]+cc[i];
cy:=cy+1;
if (cy*100) div size[x]>=t then break;
end;
end;
end;
procedure init;
begin
readln(n,t);
for i:=1 to n do
begin
a[i,2]:=i;
read(a[i,1]);
end;
readln;
qsort(1,n);
star;
end;
begin
//   assign(input,'t2.in'); reset(input);
init;
for i:=0 to n do size[i]:=b[i,2]-b[i,1]+1;
dfs(0);
writeln(tree[0]);
//  close(input);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: