QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#189587#680. Electronical plateNOI_AK_ME100 ✓47ms764kbPascal13.5kb2023-09-27 17:43:002023-09-27 17:43:00

Judging History

This is the latest submission verdict.

  • [2023-09-27 17:43:00]
  • Judged
  • Verdict: 100
  • Time: 47ms
  • Memory: 764kb
  • [2023-09-27 17:43:00]
  • Submitted

answer

program mikroshemos;
  const MAX_N = 15;
        MAX_M = MAX_N*MAX_N*2 + 2;
        ELEM_SK = 255;
        PR = '';
        RZ = '';
  type  aibe = array [1..2] of set of 0..255;
        lentele1 = array [1..MAX_M] of integer;
        lentele2 = array [1..MAX_M] of aibe;

  procedure inicializuoti_aibe (var aib: aibe);
  begin
    aib[1] := []; aib[2] := [];
  end;

  function tuscia_aibe (aib: aibe): boolean;
  begin
    tuscia_aibe := (aib[1] = []) and (aib[2] = []);
  end;
  procedure i_aibe (elem: integer; var aib: aibe);
  begin
    if elem < 255
       then aib[1] := aib[1] + [elem]
       else aib[2] := aib[2] + [elem mod 255]
  end; { �_aib� }

  procedure is_aibes (elem: integer; var aib: aibe);
    { i� aib�s pa�alina nurodyt� element� }
  begin
    if elem < 255
       then aib[1] := aib[1] - [elem]
       else aib[2] := aib[2] - [elem mod 255]
  end; { �_aib� }

  function aibeje (elem: integer; aib: aibe): boolean;
    { ar aib�je yra nurodytas elementas }
  begin
    if elem < 255
       then aibeje := elem in aib[1]
       else aibeje := (elem mod 255) in aib[2];
  end; { aib�je }

  procedure ivesti (var pral: lentele2;           { briaun� pralaidumai }
                    var m, n,       { vir��ni� skai�ius, tinkelio dydis }
                    prad, gal: integer;    { pradin�s, galin�s vir��n�s }
                    var krastas,                   { kra�tin�s vir��n�s }
                    isejimai: aibe);                { vir��ni� skai�ius }
                                          { pradin� bei galin� vir��n�s }
  { �veda pradinius duomenis }
    var md, kiekis, i, j, nn, u, v, c: integer;
        f: text;
        delta: array [1..4] of integer;
  begin
    assign (f, PR);
    reset (f);
    readln (f, n);
    inicializuoti_aibe (isejimai);  { perskait� pradinius duomenis }
    for i := 1 to n do        { sudarome i��jim� aib� }
      for j := 1 to n do
        begin
          read (f, c);
          if c = 1 then i_aibe ((i-1)*n + j, isejimai);
        end;
    close(f);
    nn := n*n;
    m := 2*nn + 2;
    prad := 2*nn + 1; gal := 2*nn + 2;
    { sudarome graf� }
    { inicializuojame briaun� pralaidum� masyv� }
    for u := 1 to m do
      inicializuoti_aibe (pral[u]);
    { surandame kra�tini� mazg� vir�utiniame tinklelyje aib� }
    inicializuoti_aibe (krastas);
    for u := 1 to nn do
      if (u <= n) or (u mod n = 1) or (u mod n = 0) or (u >= (n-1)*n)
         then i_aibe (u, krastas);
    { pradin� vir��n� sujungiame su i��jimais }
     for u := 1 to nn do
         if aibeje (u, isejimai)
            then i_aibe(u, pral[prad]);
     { sujungiame abu tinkelius }
     for u := 1 to nn do
       i_aibe (u+nn, pral[u]);
    { sujungiame vir��nes tinklelyje }
     delta[1] := -1; delta[2] := 1;  { vir��ni�, gretim� u numeriai }
     delta[3] := -n; delta[4] := n;
    for u := 1 to nn do
       for i := 1 to 4 do
          begin
            { nuvesime briaun� i� u � v }
            v := u + delta[i];
            if (1 <= v) and (v <= nn) and not (aibeje (v, isejimai)) and
               { � mazg� briauna ateiti negali }
               not (aibeje((u mod nn), krastas))
               { briauna nei�eina i� kra�to }
               then i_aibe (v, pral[u+nn])
          end;
    { sujungiame kra�tus su i��jimu }
    for u := 1 to nn do
      if aibeje (u, krastas)
         then i_aibe (gal, pral[u+nn]);
  end; { �vesti }

  procedure max_srautas (m, prad, gal: integer;     { vir��ni� skai�ius }
                                             { pradin�, galin� vir��n�s }
                         pral: lentele2;          { briaun� pralaidumai }
                         var sr_teig: lentele2);           { rastasis srautas }
  { randa maksimal� sraut� grafe }
    var e, { eil� }
        h, bakas: lentele1;  { vir��ni� auk��iai ir bakasildymai }
        sr_neig: lentele2;
        u, galva, uodega: integer;
        virs: aibe;

    procedure inicializuoti (var h, bakas: lentele1; { auk�tis ir bakas }
                             var sr_neig, sr_teig: lentele2 { srautas });
    { inicializuoja (priskiria nulius) h, s, bakas }
      var u, v: integer;
    begin
      for u := 1 to MAX_M do
        begin
          h[u] := 0;
          bakas[u] := 0;
        end;
     for u := 1 to MAX_M do
         begin
           inicializuoti_aibe (sr_neig[u]);
           inicializuoti_aibe (sr_teig[u]);
         end;
    end; { inicializuoti }

    procedure itraukti_i_eile (u: integer;  var virs: aibe;
                               var e:lentele1; var uodega: integer);
    { �traukia � eil�s pabaig� vir��n� u }
    begin
      i_aibe (u, virs);
      e[uodega] := u;
      if uodega = MAX_M
         then uodega := 1
         else uodega := uodega + 1;
    end; { �traukti_�_eil� }

    procedure pasalinti_is_eiles (var galva: integer; var virs: aibe);
    begin
      is_aibes (u, virs);
      if galva = MAX_M
         then galva := 1
         else galva := galva + 1
    end; { pa�alinti_i�_eil�s }

    procedure pakelti (u: integer; { keliama vir��n� }
                       var h: lentele1 { vir��ni� auk��iai });
    { padidinamas u auk�tis }
    { vartojami global�s kintamieji m, s, pral }
      var mini, v, ind, pralaid, vv, srautas: integer;
          galima: boolean;
    begin
      galima := true; { ar galima pakelti vir��n� }
      mini := 0;      { �emiausia vir��n� � kuri� galima leisti sraut� }
      for v := 1 to m do
        begin
           { leisime sraut� i� u � v }
           { koks pralaidumas i� u � v }
           if v < 255 then begin ind := 1; vv := v end
                      else begin ind := 2; vv := v mod 255 end;
           if vv in pral[u, ind] then pralaid := 1
                                 else pralaid := 0;
           { kiek srauto nukreipta i� u � v }
           if vv in sr_teig[u, ind] then srautas := 1
              else if vv in sr_neig[u, ind] then srautas := -1
              else srautas := 0;
           { dabar tikrai leisime sraut� }
           if pralaid - srautas > 0
              then if (h[u] <= h[v])
                      then begin
                             if mini = 0 { jei dar n� viena nerasta }
                                then mini := v
                                else if h[v] < h[mini]
                                        then mini := v;
                           end
                      else galima := false;
        end;
      if galima
         then h[u] := h[mini] + 1
    end; { pakelti }

    function min (x, y: integer): integer;
    begin
      if x < y
         then min := x
         else min := y
    end; { min }

    procedure paleisti (u: integer;
                        var sr_neig, sr_teig: lentele2; { srautai }
                        var bakas: lentele1);
    { paleid�ia vir��n�s u bake esant� sraut� }
    { vartojami global�s kintamieji m, h, pral, e, uodega }
      var v, kiekis, vv, ind, pralaid, srautas: integer;
    begin
      for v := 1 to m do
        begin
          { apskai�iuosime pralaidum� bei praleist� sraut� }
          if v < 255
             then begin ind := 1; vv := v end
             else begin ind := 2; vv := v mod 255 end;
          if vv in pral[u, ind] then pralaid := 1
                                else pralaid := 0;
          if vv in sr_teig[u, ind] then srautas := 1
             else if vv in sr_neig[u, ind] then srautas := -1
             else srautas := 0;
          if (h[v] + 1 = h[u]) and (pralaid - srautas > 0)
           { jei v �emesn� ir � j� dar galima paleisti sraut� }
           then begin
                  kiekis := min (bakas[u], pralaid - srautas);
                  bakas[u] := bakas[u] - kiekis;
                  if kiekis = 1
                     then begin
                            if aibeje (v, sr_neig[u])
                               { jei s[u, v] = -1 }
                               then begin { s[u, v] = -s[v, u] = 0 }
                                      is_aibes (v, sr_neig[u]);
                                      is_aibes (u, sr_teig[v]);
                                     end
                               else begin { jei s[u, v] = 0 }
                                       i_aibe (v, sr_teig[u]);
                                       i_aibe (u, sr_neig[v]);
                                     end;
                          end { if kiekis = 1 }
                  else if kiekis = -1
                      then begin
                            if aibeje (v, sr_teig[u])
                               { jei s[u, v] = 1 }
                               then begin { s[u, v] = -s[v, u] = 0 }
                                      is_aibes (v, sr_teig[u]);
                                      is_aibes (u, sr_neig[v]);
                                     end
                               else begin { jei s[u, v] = 0 }
                                       i_aibe (v, sr_neig[u]);
                                       i_aibe (u, sr_teig[v]);
                                     end;
                          end;
                  bakas[v] := bakas[v] + kiekis;
                  if (bakas[v] > 0) and (v <> prad)
                  then if (v <> gal) and (not (aibeje(v, virs)))
                       then itraukti_i_eile (v, virs, e, uodega);
                end;
        end;
    end; { paleisti }

  begin
    inicializuoti (h, bakas, sr_neig, sr_teig);
    galva := 1; uodega := 1; { eil� tu��ia }
    inicializuoti_aibe (virs); { eil�je esan�ios vir��n�s }
    h[prad] := m; { pradin�s vir��n�s auk�tis }
    { paleid�iame sraut� i� pradin�s vir��n�s }
    for u := 1 to m do
      if aibeje (u, pral[prad])
         then begin
                i_aibe (u, sr_teig[prad]);
                i_aibe (prad, sr_neig[u]);
                bakas[u] := 1;
                if u <> m { galin�s vir��n�s bakas begalinis }
                   then itraukti_i_eile (u, virs, e, uodega);
              end;
    while not tuscia_aibe (virs) do
      { su aibe papras�iau patikrinti ar ta pati vir��n� � eil� ne�traukiama }
      { du kartus }
      begin
        u := e[galva];
        pasalinti_is_eiles (galva, virs);
        while bakas[u] > 0 do
          begin
            pakelti (u, h);
            paleisti (u, sr_neig, sr_teig, bakas)
          end;
      end;
  end; { max_srautas }

  procedure skaiciuoti (n,             { tinklelio dydis }
                        prad: integer; { pradin� vir��n� }
                        const sr_teig: lentele2; { rasti srautai }
                        const krastas, isejimai: aibe;
                        var max_ise: integer);
    { randa rezultat� bei i��jimus tinklelio kra�te }
    var u: integer;
  begin
    max_ise := 0;
    for u := 1 to n*n do
        if aibeje (u, sr_teig[prad]) and
        not ((aibeje (u, krastas)) and (aibeje(u, isejimai)))
        { jei eina briauna ne � kra�tin� kontakt� }
           then max_ise := max_ise + 1;
  end; { skai�iuoti }

  procedure isvesti (m, n, prad, gal: integer;
                     const krastas, isejimai: aibe;
                     const sr_teig: lentele2);
  { spausdina rezultatus }
    var f: text;
        nn, nuo, u, v, max_ise, i: integer;
        kryptis: char;
  begin
    nn := n*n;
    assign (f, RZ);
    rewrite (f);
    { rasime maksimal� i��jim� skai�i� bei tuos i��jimus, kam nereik�jo }
    { tiesti grandin�s }
    skaiciuoti (n, prad, sr_teig, krastas, isejimai, max_ise);
    writeln (f, max_ise);
    { atspausdinsime grandines }
    for u := 1 to nn do
       if aibeje(u, sr_teig[prad]) and not (aibeje(u, krastas))
          then   { jei tai i��jimas ir ne kra�te }
       begin
         write (f, u, ' '); { atspausdiname i��jimo numer� }
         nuo := u;
         while not aibeje (gal, sr_teig[nuo]) do { kol nepasiek�me kra�to }
           begin
             v := 1;
             while not
             aibeje(v, sr_teig[nuo]) do
               v := v + 1;
             { nustatome krypt� }
             kryptis := '?';
             if nuo mod nn > v mod nn { � kair� arba � vir�� }
                then if abs (nuo mod nn - v mod nn) = 1 { � kair� }
                        then kryptis := 'W'
                        else kryptis := 'N'
                else if nuo mod nn < v mod nn { � de�in� arba � apa�i� }
                        then if abs (nuo mod nn - v mod nn) = 1 { � de�in� }
                                then kryptis := 'E'
                                else kryptis := 'S';
             if kryptis <> '?'
                then write (f, kryptis);
             nuo := v;
           end; { kol nepasiek�me kra�to }
         writeln (f);
       end; { grandini� i�vedimas }
    close (f);
  end; { i�vesti }

  var pral, s: lentele2; { briaun� pralaidumai bei rasti srautai }
      m, n, prad, gal: integer; { vir��ni� skai�ius, pradin� bei galin� vir�. }
      isejimai, krastas: aibe;
begin
  ivesti (pral, m, n, prad, gal, krastas, isejimai);
  max_srautas (m, prad, gal, pral, s);
  isvesti (m, n, prad, gal, krastas, isejimai, s);
end.


Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 6.25
Accepted
time: 0ms
memory: 740kb

input:

6
0 0 0 1 1 1
0 0 0 0 1 0
0 0 0 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 0 0 1 0 1

output:

6
11 E
16 NWN
17 SE
27 WNW
28 NWNWNN
29 S

result:

ok 7 lines

Test #2:

score: 6.25
Accepted
time: 0ms
memory: 720kb

input:

3
1 1 0
1 1 1
0 1 0


output:

0

result:

ok single line: '0'

Test #3:

score: 6.25
Accepted
time: 0ms
memory: 748kb

input:

4
1 1 1 0
0 1 0 0
1 1 1 1
1 1 1 1

output:

2
6 W
11 NE

result:

ok 3 lines

Test #4:

score: 6.25
Accepted
time: 0ms
memory: 724kb

input:

5
0 1 1 1 0
0 0 0 0 1
0 0 1 0 1
1 0 1 1 1
0 0 1 1 0


output:

3
13 WW
18 WS
19 NNWWW

result:

ok 4 lines

Test #5:

score: 6.25
Accepted
time: 0ms
memory: 764kb

input:

6
0 1 1 0 0 0
1 0 0 1 0 0
0 1 1 0 1 0
0 1 0 0 0 0
1 1 0 0 1 0
0 1 1 1 0 0

output:

6
10 N
14 W
17 NN
20 W
26 EENEE
29 E

result:

ok 7 lines

Test #6:

score: 6.25
Accepted
time: 2ms
memory: 728kb

input:

7
0 1 0 0 0 1 0
0 1 1 1 1 1 0
0 1 0 0 0 1 0
1 0 0 1 0 1 0
0 0 1 1 1 1 0
0 1 0 0 1 0 0
0 1 0 0 1 1 0



output:

14
9 W
10 N
11 N
12 N
13 E
16 W
20 E
27 E
31 SS
32 SS
33 NNWWSWSW
34 E
37 W
40 EE

result:

ok 15 lines

Test #7:

score: 6.25
Accepted
time: 0ms
memory: 736kb

input:

7
1 1 1 1 1 1 1
1 0 0 0 0 0 0
1 0 0 0 0 0 0
1 1 0 1 1 1 1
1 0 0 1 0 0 0
1 0 0 1 0 0 0
1 0 0 1 0 0 0

output:

6
23 SSS
25 NNEEE
26 SEE
27 NE
32 WSS
39 EEE

result:

ok 7 lines

Test #8:

score: 6.25
Accepted
time: 0ms
memory: 724kb

input:

8
0 1 0 0 1 1 1 1
0 1 0 0 1 0 0 0
0 1 0 0 1 1 0 0
0 1 1 0 1 0 0 1
0 1 0 0 1 0 0 1
0 1 0 0 1 0 0 0
0 1 0 0 1 0 0 0
0 1 0 0 1 0 0 0

output:

14
10 W
13 EEE
18 W
21 WNN
22 SENE
26 W
27 NNN
29 WSWSSS
34 W
37 EESE
42 W
45 WSS
50 W
53 EEE

result:

ok 15 lines

Test #9:

score: 6.25
Accepted
time: 0ms
memory: 724kb

input:

8
1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 0
0 0 0 1 0 1 0 0
1 0 1 1 0 1 1 0
1 0 0 0 0 0 0 0
0 0 0 1 0 1 1 0
0 0 0 1 0 1 1 0
1 1 1 0 0 0 0 0

output:

13
15 E
20 WNWW
22 EE
27 WNW
28 SWWSW
30 WSEEE
31 E
44 WSWW
46 WSS
47 E
52 S
54 S
55 E

result:

ok 14 lines

Test #10:

score: 6.25
Accepted
time: 20ms
memory: 764kb

input:

8
1 1 0 1 1 0 1 1
1 0 0 0 0 0 0 0
1 0 1 0 0 0 1 0
1 1 0 0 0 0 1 0
1 0 0 0 1 0 0 0
1 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1


output:

5
19 SSENNENWWN
23 NE
31 E
37 NENNN
46 ENE

result:

ok 6 lines

Test #11:

score: 6.25
Accepted
time: 8ms
memory: 736kb

input:

8
0 1 0 1 1 0 0 0
1 0 0 0 0 0 0 0
0 1 0 0 1 0 0 0
1 0 0 0 0 1 0 0
1 0 0 1 0 0 1 0
0 1 0 0 1 0 0 1
0 0 1 1 0 0 1 0
0 0 0 1 1 1 0 0

output:

9
18 W
21 EENN
30 EE
36 WNNNN
39 E
42 W
45 NNWNNEEN
51 WW
55 E

result:

ok 10 lines

Test #12:

score: 6.25
Accepted
time: 1ms
memory: 732kb

input:

9
1 1 1 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1
1 1 1 1 1 0 1 1 1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0
1 1 1 0 1 1 1 1 1
1 0 0 0 0 0 0 0 0
0 0 1 0 0 1 1 1 1

output:

14
20 SW
21 NWW
22 NN
23 NN
25 WNN
26 SE
42 EEE
48 WW
56 SS
57 SES
59 SS
60 NWWNNWSWW
61 NEE
62 SE

result:

ok 15 lines

Test #13:

score: 6.25
Accepted
time: 3ms
memory: 760kb

input:

9
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 0
0 1 0 0 0 1 1 0 0
1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 1 0
0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0

output:

16
21 NN
22 NN
23 NN
24 NN
29 NNN
33 WWSWWSW
34 NNN
43 ENNNN
53 E
58 SWWW
59 SS
60 NNWSWWSWW
61 SS
62 E
69 S
71 E

result:

ok 17 lines

Test #14:

score: 6.25
Accepted
time: 27ms
memory: 724kb

input:

10
0 1 1 0 0 0 0 0 0 0
0 1 1 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 1 0 0
1 1 0 0 0 0 0 1 0 0
0 1 0 0 1 0 0 1 0 0
0 0 0 0 1 1 0 1 1 0
0 1 1 0 0 1 1 1 1 0
1 1 0 0 0 0 1 0 1 1
0 0 0 0 0 0 0 0 0 0

output:

26
12 W
17 N
18 N
19 N
33 NWW
34 NNN
35 NNN
36 NNN
38 EE
42 NW
48 EE
52 W
55 WSSSS
58 EE
65 SSS
66 NNWWWSSWW
69 E
72 W
73 SS
76 SS
77 NNNNNEEE
78 SS
79 E
82 S
87 S
89 S

result:

ok 27 lines

Test #15:

score: 6.25
Accepted
time: 47ms
memory: 728kb

input:

13
1 1 0 0 0 0 0 0 0 0 0 1 1
0 1 1 0 0 0 0 0 0 0 1 1 0
0 0 1 1 0 0 0 0 0 1 1 0 0
0 0 0 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 0 0
0 0 0 0 1 0 0 1 0 0 1 0 0
0 0 0 0 0 1 1 0 0 0 1 0 0
0 0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 1 0 1 1 0 0 0
1 0 0 0 0 1...

output:

35
15 W
16 N
24 N
25 E
29 WW
30 NN
36 NN
37 EE
43 WWW
44 NNN
45 NNN
46 NNN
47 NNN
48 NNN
57 WWWW
62 NEEE
63 EE
70 WWWW
73 SESWSWSWSWSWS
76 EE
84 WWWWW
85 SWSWSWSWSWS
89 EE
96 WWWW
101 EEE
108 WWW
113 EEEE
120 WW
125 EEEEE
132 W
137 ESS
139 SS
140 EEE
149 ES
153 EES

result:

ok 36 lines

Test #16:

score: 6.25
Accepted
time: 14ms
memory: 724kb

input:

15
0 1 1 1 0 0 0 0 0 0 0 0 0 1 0
0 1 1 0 0 0 1 0 0 1 0 0 0 1 0
0 0 0 0 0 0 1 0 0 1 0 0 1 1 0
0 0 0 1 1 0 1 0 0 1 0 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 1 1 1 1 0 0 1 1 1 1 0 0
0 0 0 0 0 0 1 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 1 0 0 0 0...

output:

41
17 W
18 SWW
22 N
25 N
29 E
37 WNN
40 WNN
43 NN
44 E
49 WWW
50 NNN
52 WSWWWWW
55 ENNN
57 NNN
58 EE
84 NWNNNN
85 NEEEEE
94 WWW
95 SWWWW
96 NWWWWW
97 ESSSSSSSS
100 WSSSSSSSS
101 NEEEE
102 SEEE
103 EE
112 SWWWWWW
115 ESEEEE
141 WWWWW
142 SSSSS
145 EEEEE
152 SSW
153 SSSS
154 SSSS
156 WSSSS
160 ESSSS
1...

result:

ok 42 lines