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 1249. Ancient Necropolis

Isn't it strange?
Posted by AlexF 10 Feb 2006 14:55
var
  a: Array[0..3001, 0..3001] of Boolean;
  n, m, i, j: Integer;
  q: Boolean;

procedure Vvod;
var
  ch: Byte;
begin
  readln(n, m);
  for j := 1 to n do
    for i := 1 to m do
    begin
      if i = m then
        readln(ch)
      else
        read(ch);
      if ch = 1 then
        a[i, j] := true;
    end;
end;

procedure Obnul(x, y: Integer);
begin
  if a[x, y] = false then
    Exit
  else
  begin
    a[x, y] := false;
    Obnul(x + 1, y);
    Obnul(x - 1, y);
    Obnul(x, y + 1);
    Obnul(x, y - 1);
  end;
end;

procedure Check;
var
  ii, jj, dlV, dlH: Integer;
begin
  for j := 1 to n do
    for i := 1 to m do
      if a[i, j] = true then
      begin
        jj := j;
        while a[i, jj] = true do
          inc(jj);
        dlV := jj - j;
        ii := i;
        while a[ii, j] = true do
          inc(ii);
        dlH := ii - i;


        for jj := j to j + dlV - 1 do
          for ii := i to i + dlH - 1 do
            if a[ii, jj] = false then
            begin
              writeln('No');
              q := false;
              Exit;
            end;

        for jj := j to j + dlV - 1 do
          if (a[i - 1, jj] = true) or (a[i + dlH, jj] = true) then
          begin
            writeln('No');
            q := false;
            Exit;
          end;


        for ii := i to i + dlH - 1 do
          if (a[ii, j - 1] = true) or (a[ii, j + dlV] = true) then
          begin
            writeln('No');
            q := false;
            Exit;
          end;

        Obnul(i, j);
      end;
end;

begin
  q := true;
  Vvod;
  Check;
  if q = true then
    writeln('Yes');
  readln;
end.

If I use Integer I have MLE 6 1.500 Kb and if i use ShortInt
I have WA 10 with memory 190 Kb!
Isn't it strange?
No it's not (+)
Posted by Michael Rybak (accepted@ukr.net) 10 Feb 2006 15:09
Freepascal organizes the memory allocation process in such a way that when you define an array of 3000x3000 and use only first 100 lines of it, then the memory usage will be 3000*100*sizeof(type), not 3000*3000.

When using shortint, you can never exceed 128, so your program is probably incorrect, but not running out of memory; nevertheless, this is a yes-no output problem, so the probability is high that you pass some tests with a wrong program.

Also note that Integer = Longint; if you want a 2-byte int, use Word or Smallint.

Edited by author 10.02.2006 15:10
:)
Posted by ACM.Krupko_Victor[Ivanovo SPU] 10 Feb 2006 15:14
3000*3000=9000000 9000 kb
your must use O(2*M) MEMORY