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

Обсуждение задачи 1003. Чётность

1003:My program uses about only 100K, but on the judge machine, it needs more than 1000K. Why?
Послано Han Wentao 20 июл 2001 05:44
program Timus_1003;
const
  MaxQAs=5000;
  EndFlag=-1;
type
  TQA=
    record
      First,Last:LongInt;
      Answer:Boolean;
    end;
var
  nQAs,X:LongInt;
  QAs:array [1..MaxQAs] of TQA;
function InputData:Boolean;
var
  i,Len:LongInt;
  Temp:string;
begin
  ReadLn(Len);
  if Len=EndFlag then
    begin
      InputData:=False;
      Exit;
    end;
  ReadLn(nQAs);
  for i:=1 to nQAs do
    with QAs[i] do
      begin
        ReadLn(First,Last,Temp);
        while Temp[1]=' ' do
          Delete(Temp,1,1);
        Answer:=Temp='odd';
      end;
  InputData:=True;
end;
procedure Solve;
var
  i,nItems:LongInt;
  Items:array [1..MaxQAs] of TQA;
function Insert(QA:TQA):Boolean;
var
  i,MaxLast,MinLast:LongInt;
  MaxAnswer,MinAnswer:Boolean;
  Item:TQA;
function FindItem(First:LongInt):LongInt;
var
  i,j,k:LongInt;
begin
  i:=1;
  j:=nItems;
  repeat
    k:=(i+j) div 2;
    if Items[k].First=First then
      begin
        FindItem:=k;
        Exit;
      end
    else
      if Items[k].First>First then
        j:=k-1
      else
        i:=k+1;
  until i>j;
  FindItem:=0;
end;
procedure InsertItem(Item:TQA);
var
  i,j:LongInt;
begin
  for i:=1 to nItems do
    if Items[i].First>Item.First then
      begin
        for j:=nItems downto i do
          Items[j+1]:=Items[j];
        Inc(nItems);
        Items[i]:=Item;
        Exit;
      end;
  Inc(nItems);
  Items[nItems]:=Item;
end;
function Subtract(A,B:Boolean):Boolean;
begin
  Subtract:=A xor B;
end;
begin
  repeat
    i:=FindItem(QA.First);
    if i=0 then
      begin
        InsertItem(QA);
        Insert:=True;
        Exit;
      end
    else
      if Items[i].Last=QA.Last then
        begin
          Insert:=Items[i].Answer=QA.Answer;
          Exit;
        end
      else
        begin
          if Items[i].Last>QA.Last then
            begin
              MaxLast:=Items[i].Last;
              MinLast:=QA.Last;
              MaxAnswer:=Items[i].Answer;
              MinAnswer:=QA.Answer;
            end
          else
            begin
              MaxLast:=QA.Last;
              MinLast:=Items[i].Last;
              MaxAnswer:=QA.Answer;
              MinAnswer:=Items[i].Answer;
            end;
          with Items[i] do
            begin
              Last:=MinLast;
              Answer:=MinAnswer;
            end;
          with Item do
            begin
              First:=MinLast+1;
              Last:=MaxLast;
              Answer:=Subtract(MaxAnswer,MinAnswer);
            end;
          QA:=Item;
        end;
  until False;
end;
begin
  nItems:=0;
  FillChar(Items,SizeOf(Items),0);
  for i:=1 to nQAs do
    if not Insert(QAs[i]) then
      begin
        X:=i-1;
        Exit;
      end;
  X:=nQAs;
end;
procedure Print;
begin
  WriteLn(X:0);
end;
begin
  while InputData do
    begin
      Solve;
      Print;
    end;
end.
This is a Delphi compiler ^)))
Послано Ilya V. Elterman 20 июл 2001 10:20
> program Timus_1003;
> const
>   MaxQAs=5000;
>   EndFlag=-1;
> type
>   TQA=
>     record
>       First,Last:LongInt;
>       Answer:Boolean;
>     end;
> var
>   nQAs,X:LongInt;
>   QAs:array [1..MaxQAs] of TQA;
> function InputData:Boolean;
> var
>   i,Len:LongInt;
>   Temp:string;
> begin
>   ReadLn(Len);
>   if Len=EndFlag then
>     begin
>       InputData:=False;
>       Exit;
>     end;
>   ReadLn(nQAs);
>   for i:=1 to nQAs do
>     with QAs[i] do
>       begin
>         ReadLn(First,Last,Temp);
>         while Temp[1]=' ' do
>           Delete(Temp,1,1);
>         Answer:=Temp='odd';
>       end;
>   InputData:=True;
> end;
> procedure Solve;
> var
>   i,nItems:LongInt;
>   Items:array [1..MaxQAs] of TQA;
> function Insert(QA:TQA):Boolean;
> var
>   i,MaxLast,MinLast:LongInt;
>   MaxAnswer,MinAnswer:Boolean;
>   Item:TQA;
> function FindItem(First:LongInt):LongInt;
> var
>   i,j,k:LongInt;
> begin
>   i:=1;
>   j:=nItems;
>   repeat
>     k:=(i+j) div 2;
>     if Items[k].First=First then
>       begin
>         FindItem:=k;
>         Exit;
>       end
>     else
>       if Items[k].First>First then
>         j:=k-1
>       else
>         i:=k+1;
>   until i>j;
>   FindItem:=0;
> end;
> procedure InsertItem(Item:TQA);
> var
>   i,j:LongInt;
> begin
>   for i:=1 to nItems do
>     if Items[i].First>Item.First then
>       begin
>         for j:=nItems downto i do
>           Items[j+1]:=Items[j];
>         Inc(nItems);
>         Items[i]:=Item;
>         Exit;
>       end;
>   Inc(nItems);
>   Items[nItems]:=Item;
> end;
> function Subtract(A,B:Boolean):Boolean;
> begin
>   Subtract:=A xor B;
> end;
> begin
>   repeat
>     i:=FindItem(QA.First);
>     if i=0 then
>       begin
>         InsertItem(QA);
>         Insert:=True;
>         Exit;
>       end
>     else
>       if Items[i].Last=QA.Last then
>         begin
>           Insert:=Items[i].Answer=QA.Answer;
>           Exit;
>         end
>       else
>         begin
>           if Items[i].Last>QA.Last then
>             begin
>               MaxLast:=Items[i].Last;
>               MinLast:=QA.Last;
>               MaxAnswer:=Items[i].Answer;
>               MinAnswer:=QA.Answer;
>             end
>           else
>             begin
>               MaxLast:=QA.Last;
>               MinLast:=Items[i].Last;
>               MaxAnswer:=QA.Answer;
>               MinAnswer:=Items[i].Answer;
>             end;
>           with Items[i] do
>             begin
>               Last:=MinLast;
>               Answer:=MinAnswer;
>             end;
>           with Item do
>             begin
>               First:=MinLast+1;
>               Last:=MaxLast;
>               Answer:=Subtract(MaxAnswer,MinAnswer);
>             end;
>           QA:=Item;
>         end;
>   until False;
> end;
> begin
>   nItems:=0;
>   FillChar(Items,SizeOf(Items),0);
>   for i:=1 to nQAs do
>     if not Insert(QAs[i]) then
>       begin
>         X:=i-1;
>         Exit;
>       end;
>   X:=nQAs;
> end;
> procedure Print;
> begin
>   WriteLn(X:0);
> end;
> begin
>   while InputData do
>     begin
>       Solve;
>       Print;
>     end;
> end.
>
So?
Послано Han Wentao 21 июл 2001 06:48