laser

Time limit: 1.2s Memory limit: 512MB Input: Output:

Loid Forger trebuie să deblocheze un seif de înaltă securitate. Mecanismul de deblocare este protejat de un panou dreptunghiular reprezentat folosind o matrice de dimensiune N×MN \times M în care fiecare celulă conține o oglindă dispusă pe una dintre cele două diagonale.

Poziția inițială a fiecărei oglinzi este reprezentată prin caracterele /`/` sau \`\backslash `.

Panoul este înconjurat de un chenar format din pereți retrovizori care reflectă orice fascicul înapoi pe direcția din care a venit (marginile funcționează ca oglinzi: cele verticale reflectă orizontal, iar cele orizontale reflectă vertical).

Un fascicul laser se deplasează doar pe direcții orizontale sau verticale prin centrele celulelor sau pe segmentele dintre centrele acestora. Mișcarea sa respectă următoarele reguli:

  • fasciculul se deplasează în linie dreaptă până când întâlnește o oglindă sau un perete;
  • dacă întâlnește un perete exterior, își inversează direcția (la 180180^\circ);
  • dacă întâlnește o oglindă \`\backslash`, atunci direcția se schimbă astfel (cu 9090^\circ): susdreapta\text{sus} \leftrightarrow \text{dreapta} respectiv josstaˆnga\text{jos} \leftrightarrow \text{stânga}
  • dacă întâlnește o oglindă /`/`, atunci direcția se schimbă astfel (cu 9090^\circ): susstaˆnga\text{sus} \leftrightarrow \text{stânga} respectiv josdreapta\text{jos} \leftrightarrow \text{dreapta}

Considerăm toate stările posibile ale fasciculului, unde o stare este determinată de o poziție și o direcție de deplasare. Se poate demonstra că, pornind din orice stare, fasciculul va reveni din nou în acea stare. Astfel, toate stările se împart în cicluri disjuncte. Numim drum de laser un astfel de ciclu.

De exemplu, pentru configurația de 2×22 \times 2 de mai jos, există 55 drumuri de laser: 44 drumuri scurte care ating peretele exterior și un ciclu închis în centru.

Pentru fiecare celulă (i,j)(i, j) se cunoaște un număr întreg C[i][j]C[i][j] care reprezeinta costul pentru a efectua o operație de flip în celula respectivă. Folosind operația flip putem roti oglinda (înlocuind /`/` cu \`\backslash` sau invers). Oglinda din fiecare celulă poate fi rotită cel mult o dată.

Scopul lui Loid este să aleagă un subset de oglinzi pentru care va aplica operația flip astfel încât:

  • numărul total de drumuri de laser să fie minim posibil;
  • dintre toate modurile de a ajunge într-o configurație cu un număr minim de drumuri, costul însumat al operațiilor flip să fie minim.

Date de intrare

Pe prima linie se află numerele NN și MM, cu semnificația din enunț.

Următoarele NN linii conțin câte un șir de lungime MM, format din caracterele /`/` și \`\backslash`. Al jj-lea caracter de pe a ii-a linie dintre aceste NN reprezintă orientarea inițială a oglinzii din celula (i,j)(i, j)

Următoarele NN linii conțin câte MM numere întregi. Al jj-lea număr de pe a ii-a linie dintre aceste NN reprezintă valoarea C[i][j]C[i][j].

Date de ieșire

Pe prima linie se vor afișa două numere: numărul minim de drumuri de laser și costul minim total.
Pe următoarele NN linii se va afișa o matrice de 00 și 11 (11 pentru flip, 00 pentru neschimbat).

Restricții și precizări

  • 1N,M10001 \leq N, M \leq 1000
  • 109C[i][j]109-10^9 \leq C[i][j] \leq 10^9
  • Pentru subtask-urile 1, 2, 3, 4, 5, 6, 7, 8, 9, toate costurile sunt 0\geq 0.
  • Două drumuri de laser sunt distincte dacă mulțimile punctelor prin care trece fasciculul laser sunt distincte
  • Dacă numărul minim de lanțuri este corect, se acordă 10%10\% din punctajul testului.
  • Dacă numărul minim de lanțuri și costul minim sunt corecte, se acordă 90%90\% din punctajul testului.
  • Dacă și matricea de 0/1 este corectă, se acordă 100%100\% din punctajul testului.
# Scor Restricții
1 8 N,M4N, M \leq 4
2 5 C[i][j]=0C[i][j] = 0
3 12 N=2N = 2
4 15 Există o soluție optimă cu exact un flip, iar N,M40N, M \leq 40
5 12 N,M20N, M \leq 20
6 6 Există o soluție optimă cu exact un flip
7 7 N,M200N, M \leq 200
8 5 N,MN, M pare, celula (i,j)(i, j) are / dacă și numai dacă ii și jj au aceeași paritate.
9 11 Toate costurile sunt 0\geq 0
10 19 Fără alte restricții

Exemplu 1

stdin

2 2
/\
\/
1 4
3 2

stdout

4 1
10
00

Explicație

Configurația inițială (cea din desenul de 2×22 \times 2) are 55 drumuri. Prin operarea unui flip în poziția (1,1)(1, 1), numărul de drumuri scade la 44, acesta fiind minimul posibil pentru o matrice 2×22 \times 2. Costul este C[1][1]=1C[1][1] = 1.

Exemplu 2

stdin

1 1
/
-5

stdout

2 -5
1

Explicație

Indiferent de orientarea oglinzii, există mereu 22 drumuri. Deoarece costul rotirii este 5-5, este optim să efectuăm un flip.

Log in or sign up to be able to send submissions!