ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1037. Управление памятью

Help me . I don't know why I got Wrong Anser
Послано XueMao 27 июн 2003 21:04
Program Memory_Management;

Type Lion=Record
            Num,Time:word;
          End;

Var i,j,k,k1,m,n,r,t,Pos:longint;
    c:char;
    Ld,Rd,Left,Right:array[0..30001] of Word;
    Action:array[0..80001] of Lion;
    Time:array[0..30001] of Word;

Procedure MakeTree(x,Min:word);
Var k:Word;
Begin
  if x=Min then
  begin
    Left[x]:=0;
    Right[x]:=0;
    Ld[x]:=0;
    Rd[x]:=0;
    exit;
  end;
  k:=(x-Min) shr 1 +Min;
  Left[x]:=k;
  MakeTree(k,Min);
  Ld[x]:=Ld[k]+Rd[k]+1;
  if x-1>k then
  begin
    Right[x]:=x-1;
    MakeTree(x-1,k+1);
    Rd[x]:=Ld[x-1]+Rd[x-1]+1;
  end
  else
  begin
    Right[x]:=0;
    Rd[x]:=0;
  end;
End;

Procedure Add(x:Word);
Begin
  inc(t);
  Action[t].Num:=x;
  Action[t].Time:=k+600;
  Time[x]:=k+600;
  writeln(x);
end;

Procedure Find_Del(x:Word);
Begin
  if (Ld[x]=0)and(Rd[x]=0) then Add(x)
  else if Ld[x]>0 then
  begin
    Find_Del(Left[x]);
    dec(Ld[x]);
  end
  else
  begin
    Find_Del(Right[x]);
    dec(Rd[x]);
  end
End;

Procedure Find_Inc(x:longint);
Begin
  if x=Pos then exit;
  if Left[x]>=Pos then
  begin
    Find_Inc(Left[x]);
    inc(Ld[x]);
  end
  else
  begin
    Find_Inc(Right[x]);
    inc(Rd[x]);
  end;
End;

Begin
  Fillchar(Time,sizeof(Time),0);
  MakeTree(30001,1);
  r:=1;
  t:=0;
  while not(eof) do
  begin
    read(k);
    repeat
      read(c);
    until c<>' ';
    while (r<=t)and(Action[r].time<=k) do
    begin
      if Action[r].time=time[Action[r].Num] then
      begin
        Pos:=Action[r].Num;
        Find_Inc(30001);
        Time[Action[r].Num]:=0;
      end;
      inc(r);
    end;
    if c='.' then
    begin
      read(k1);
      if k<Time[k1] then
      begin
        writeln('+');
        inc(t);
        Action[t].Num:=k1;
        Action[t].time:=k+600;
        Time[k1]:=k+600;
      end
      else writeln('-');
    end
    else Find_Del(30001);
    readln;
  end;
End.
Re: Help me . I don't know why I got Wrong Anser
Послано XueMao 4 июл 2003 18:01
Sorry ! How careless I am ! I got ac now