Diferente pentru problema/ciocolata2 intre reviziile #6 si #34

Nu exista diferente intre titluri.

Diferente intre continut:

== include(page="template/taskheader" task_id="ciocolata2") ==
Luând o pauză de la curăţenie, Henry şi Hetty se joacă cu un caroiaj de dimensiuni $N * M$ şi o mulţime de bucăţi de ciocolată de dimensiuni $2 * 1$. Fiecare bucată de ciocolată poate fi plasată oriunde în caroiaj cât timp acoperă exact două celule. Bucăţile de ciocolată pot fi plasate atât vertical cât şi orizontal, şi nu trebuie să se suprapună cu alte bucăţi. O celulă se consideră acoperită dacă există o bucată de ciocolată plasată deasupra ei.
Luând o pauză de la curăţenie, Henry şi Hetty se joacă cu un caroiaj de dimensiuni $N * M$ şi multe bucăţi de ciocolată de dimensiuni $2 * 1$. Fiecare bucată de ciocolată poate fi plasată oriunde în caroiaj cât timp acoperă exact două celule. Bucăţile de ciocolată pot fi plasate atât vertical cât şi orizontal, şi nu trebuie să se suprapună cu alte bucăţi. O celulă se consideră acoperită dacă există o bucată de ciocolată plasată deasupra ei.
 
Henry şi Hetty vor executa $K+1$ paşi. La pasul $0$, Henry o roagă pe Hetty să aşeze o mulţime $A{~0~}$ bucăţi de ciocolată în caroiaj astfel încât să acopere toate celulele. Apoi, paşii de la $1$ la $K$ constau în următoarele etape:
 
# Henry alege o mulţime $C{~i~}$ de celule nemarcate şi le marchează. Odată ce o celulă este marcată, ea rămâne astfel pentru toţi paşii ce vor urma.
# Hetty trebuie acum să se asigure că toate celulele marcate sunt descoperite, şi toate celulele nemarcate sunt acoperite. Pentru a face acest lucru, ea va alege o mulţime $E{~i~}$ de bucăţi de ciocolată aşezate pe caroiaj şi le va elimina; apoi, ea va aşeza pe caroiaj o altă mulţime $A{~i~}$ de bucăţi de ciocolată (posibil vidă).
Henry şi Hetty vor executa $K+1$ paşi. La pasul $0$, Henry o roagă pe Hetty să aşeze o mulţime $A0$ bucăţi de ciocolată în caroiaj astfel încât să acopere toate celulele. Apoi, paşii de la $1$ la $K$ constau în următoarele etape:
 
# Henry alege o mulţime $Ci$ de celule nemarcate şi le marchează. Odată ce o celulă este marcată, ea rămâne astfel pentru toţi paşii ce vor urma.
# Hetty trebuie acum să se asigure că toate celulele marcate sunt descoperite, şi toate celulele nemarcate sunt acoperite. Pentru a face acest lucru, ea va alege o mulţime $Ei$ de bucăţi de ciocolată aşezate pe caroiaj şi le va elimina; apoi, ea va aşeza pe caroiaj o altă mulţime $Ai$ de bucăţi de ciocolată (posibil vidă).
 
Ajutaţi-o pe Hetty să facă paşii necesari: dacă reuşeşte să îi execute corect, poate mânca toată ciocolata folosită pentru joc!
h2. Date de intrare
Pe prima linie a fişierului de intrare $ciocolata2.in$ se vor afla trei numere naturale $N$, $M$ şi $K$, cu semnificaţia din enunţ. Următoarele linii descriu paşii de la $1$ la $K$: pe prima linie ce descrie pasul $i$ se va afla un număr natural $Bi$ - numărul de celule blocate de Henry la pasul $i$. Pe următoarele $Bi$ linii se vor afla perechi de numere naturale $X$ şi $Y$, reprezentând coordonatele celulelor blocate de Henry la pasul curent.
Pe prima linie a fişierului de intrare $ciocolata2.in$ se vor afla trei numere naturale $N$, $M$ şi $K$, cu semnificaţia din enunţ. Următoarele linii descriu paşii de la $1$ la $K$: pe prima linie ce descrie pasul $i$ se va afla un număr natural $B{~i~}$ - numărul de celule marcate de Henry la pasul $i$. Pe următoarele $B{~i~}$ linii se vor afla perechi de numere naturale $X$ şi $Y$, reprezentând coordonatele celulelor marcate de Henry la pasul curent.
h2. Date de ieşire
O mulţime de bucăţi de ciocolată este afişată în felul următor: pe prima linie, afişaţi un număr natural $P$, reprezentând dimensiunea mulţimii. Apoi, pe următoarele $P$ linii, afişaţi patru numere naturale X1, Y1, X2, Y2 reprezentând coordonatele celulelor (X1, Y1) and (X2, Y2) acoperite de piesa curentă. Atenţie: aceste celule trebuie să fie adiacente.
O mulţime de bucăţi de ciocolată este afişată în felul următor: pe prima linie afişaţi un număr natural $P$, reprezentând dimensiunea mulţimii. Apoi, pe următoarele $P$ linii, afişaţi patru numere naturale $X{~1~}$, $Y{~1~}$, $X{~2~}$, $Y{~2~}$ reprezentând coordonatele celulelor $(X{~1~}, Y{~1~})$ şi $(X{~2~}, Y{~2~})$ acoperite de bucata curentă. Atenţie: aceste celule trebuie să fie adiacente.
În fişierul de ieşire $ciocolata2.out$ trebuie să afişaţi întâi mulţimea de piese $A0$ adăugate de Hetty la pasul $0$. Apoi, pentru fiecare pas $i$ din cei $K$ rămaşi, trebuie să afişaţi întâi mulţimea de piese $Ei$ eliminate de Hetty, şi apoi mulţimea de piese $Ai$ adăugate de Hetty, în această ordine. Dacă nu este posibil ca Hetty să execute pasul $i$, afişaţi -1 şi terminaţi execuţia programului, ignorând paşii rămaşi din joc.
În fişierul de ieşire $ciocolata2.out$ trebuie să afişaţi întâi mulţimea $A{~0~}$ de bucăţi de ciocolată adăugate de Hetty la pasul $0$. Apoi, pentru fiecare pas $i$ din cei $K$ rămaşi, trebuie să afişaţi întâi mulţimea $E{~i~}$ de bucăţi eliminate de Hetty, şi apoi mulţimea $A{~i~}$ de bucăţi adăugate de Hetty, în această ordine. Dacă nu este posibil ca Hetty să execute pasul $i$, afişaţi $"-1"$ şi terminaţi execuţia programului, ignorând paşii rămaşi.
h2. Restricţii
* $... ≤ ... ≤ ...$
* $1 ≤ N, M ≤ 70$
* $1 ≤ K ≤ 1700$
* Pentru $10%$ din teste, $1 ≤ N, M ≤ 10$.
* Pentru $40%$ din teste, $1 ≤ N, M ≤ 50$.
* Se garantează că pasul $0$ poate fi mereu efectuat.
* Se garantează că nicio celulă nu va fi marcată de două ori.
* Coordonatele celulelor sunt indexate de la $1$.
 
h2. Afişare rapidă
 
Deoarece fişierele de ieşire generate pot fi mari, se recomandă parsarea afişării. Pentru a vă fi de ajutor, vă oferim următorul cod:
 
== code(cpp) |
#include <fstream>
 
using namespace std;
 
class Writer {
  public:
    Writer(const char *name):
        m_stream(name) {
        memset(m_buffer, 0, sizeof(m_buffer));
        m_pos = 0;
    }
 
    Writer& operator<<(int a) {
        int many = 0;
        do {
            digit_buffer[many++] = a % 10 + '0';
            a /= 10;
        } while (a > 0);
        for (int i = many - 1; i >= 0; --i)
            putchar(digit_buffer[i]);
        return *this;
    }
 
    Writer& operator<<(const char *s) {
        for (; *s; ++s)
            putchar(*s);
        return *this;
    }
 
    ~Writer() {
        m_stream.write(m_buffer, m_pos);
    }
 
  private:
    void putchar(char c) {
        m_buffer[m_pos++] = c;
        if (m_pos == kBufferSize) {
            m_stream.write(m_buffer, m_pos);
            m_pos = 0;
        }
    }
 
    static const int kBufferSize = 32768;
    ofstream m_stream;
    char m_buffer[kBufferSize];
    char digit_buffer[30];
    int m_pos;
} fout("ciocolata2.out");
==
 
Această clasă poate afişa doar *numere naturale nenegative* şi *şiruri de caractere*. Spre exemplu, pentru a afişa o pereche de numere separate prin spaţiu, respectiv numărul $-1$, folosiţi:
 
== code(cpp) |
fout << a << " " << b << "\n";
fout << "-1\n";
==
h2. Exemplu
1 1 1 2
2 2 2 3
1
2 1 2 2
1 2 2 2
-1
| Mulţimea A0 adăugată iniţial este formată din bucăţile ((1,1),(1,2)), ((2,1),(2,2)), ((1,3),(2,3)).
Eliminăm mulţimea E1 = ((2,1),(2,2)), ((1,3),(2,3)) şi adăugăm mulţimea A1 ((2,2),(2,3)) la primul pas.
Eliminăm mulţimea E2 = ((1,1),(1,2)), ((2,2),(2,3)) şi adăugăm mulţimea A2 ((2,1),(2,2)) la al doilea pas.
Pasul 3 nu poate fi efectuat aşa că afişăm -1. Ignorăm pasul 4.
| Mulţimea A{~0~} adăugată iniţial este formată din bucăţile ((1,1),(1,2)), ((2,1),(2,2)), ((1,3),(2,3)).
La pasul 1 se marcheaza celulele (2,1) şi (1,3). Eliminăm mulţimea E{~1~} = { ((2,1),(2,2)), ((1,3),(2,3)) }
şi adăugăm mulţimea A{~1~} = { ((2,2),(2,3)) } la primul pas.
La pasul 2 se marcheaza celulele (1,1) şi (2,3). Eliminăm mulţimea E{~2~} = { ((1,1),(1,2)), ((2,2),(2,3)) }
şi adăugăm mulţimea A{~2~} = { ((1,2),(2,2)) } la al doilea pas.
La pasul 3 se marcheaza celula (1,2). Nu există nicio variantă pentru a compune mulţimile E{~3~} si A{~3~}
aşa că afişăm -1. Ignorăm pasul 4.
|
== include(page="template/taskfooter" task_id="ciocolata2") ==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.