比赛 |
20121012上午 |
评测结果 |
AAAAAAAAAA |
题目名称 |
引爆炸弹 |
最终得分 |
100 |
用户昵称 |
Vow Ryan |
运行时间 |
0.562 s |
代码语言 |
Pascal |
内存使用 |
5.51 MiB |
提交时间 |
2012-10-12 10:16:25 |
显示代码纯文本
var
v,w,head,next,root:array[0..200100]of longint;
a:array[0..200100]of int64;
i,j,k,l,m,n,x,y,z,top:longint;
ans:int64;
procedure init;
var
x,y,z,top:longint;
begin
read(n,m);
top:=0;
for i:=1 to n do
begin
read(x,v[i]);
if x=0 then
begin
inc(root[0]);
root[root[0]]:=i;
continue;
end;
inc(top);
w[top]:=i;
next[top]:=head[x];
head[x]:=top;
end;
end;
procedure dp(x:longint);
var
i,j:longint;
begin
if a[x]>0 then exit;
i:=head[x];
a[x]:=v[x];
j:=n+1;
while i<>0 do
begin
dp(w[i]);
if a[x]<v[x]+a[w[i]] then
begin
a[x]:=v[x]+a[w[i]];
j:=w[i];
end;
i:=next[i];
end;
if j<>n+1 then a[j]:=0;
end;
procedure sort(head,tail:longint);
var
i,j:longint;
x,t:int64;
begin
i:=head;
j:=tail;
x:=a[(i+j)shr 1];
while i<=j do
begin
while a[i]>x do inc(i);
while a[j]<x do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
end;
if head<j then sort(head,j);
if i<tail then sort(i,tail);
end;
begin
assign(input,'bombb.in');reset(input);
assign(output,'bombb.out');rewrite(output);
init;
for i:=1 to root[0] do dp(root[i]);
sort(1,n);
for i:=1 to m do ans:=ans+a[i];
writeln(ans);
close(input);close(output);
end.