ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1003. Parity

1003:My program uses about only 100K, but on the judge machine, it needs more than 1000K. Why?
Posted by Han Wentao 20 Jul 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 ^)))
Posted by Ilya V. Elterman 20 Jul 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?
Posted by Han Wentao 21 Jul 2001 06:48