Fişierul intrare/ieşire:ciocolata2.in, ciocolata2.outSursăAlgoritmiada 2017, Runda 1
AutorVlad GavrilaAdăugată deGavrilaVladGavrila Vlad GavrilaVlad
Timp execuţie pe test0.5 secLimită de memorie262144 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Ciocolata 2

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 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:

  1. 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.
  2. 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!

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 marcate de Henry la pasul i. Pe următoarele Bi linii se vor afla perechi de numere naturale X şi Y, reprezentând coordonatele celulelor marcate de Henry la pasul curent.

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) şi (X2, Y2) 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 A0 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 Ei de bucăţi eliminate de Hetty, şi apoi mulţimea Ai 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.

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.

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:

#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:

fout << a << " " << b << "\n";
fout << "-1\n";

Exemplu

ciocolata2.inciocolata2.outExplicaţie
2 3 4
2
2 1
1 3
2
1 1
2 3
1
1 2
1
2 2
3
1 1 1 2
2 1 2 2
1 3 2 3
2
2 1 2 2
1 3 2 3
1
2 2 2 3
2
1 1 1 2
2 2 2 3
1
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)).
La pasul 1 se marcheaza celulele (2,1) şi (1,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.
La pasul 2 se marcheaza celulele (1,1) şi (2,3). Eliminăm mulţimea E2 = { ((1,1),(1,2)), ((2,2),(2,3)) }
şi adăugăm mulţimea A2 = { ((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 E3 si A3
aşa că afişăm -1. Ignorăm pasul 4.
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?