比赛 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.