acoperire

Time limit: 1s Memory limit: 256MB Input: Output:

Marele Maestru dorește să construiască o tablă de șah specială, cu 88 linii și 88 coloane. O acoperire a acestei table este un mod de a aranja pătrate mai mici (nu neapărat toate de aceeași mărime), astfel încât pătratele să nu se suprapună între ele, dar să acopere perfect întreaga suprafață a tablei de șah. Laturile pătratelor pot fi orice număr întreg între 11 și 88.

Parcurgând celulele matricei asociate tablei de la stânga la dreapta și de sus în jos (mai întâi pe linii, apoi pe coloane), scriem într-o listă latura pătratelor pe care le parcurgem doar prima oară când le întâlnim. Această listă reprezintă transcrierea acoperirii.

De exemplu, să considerăm următoarea acoperire:

Aici am folosit un pătrat 6×66 \times 6 (A), șase pătrate 2×22 \times 2 (B, C, D, E, F, G) și patru pătrate 1×11 \times 1 (H, I, J, K). Parcurgând tabla, vom obține lista de transcriere:
[6, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1].

Dacă, de exemplu, ne uităm la altă operă a Maestrului:

În acest caz, pătratele sunt deja etichetate în ordinea primei lor apariții la parcurgerea tablei. Prin urmare, transcrierea completă a acoperirii este
[1, 1, 2, 2, 2, 1, 1, 3, 3, 2, 2, 3, 3, 2].

Generăm toate listele care corespund unor acoperiri valide ale tablei 8×88 \times 8 și le sortăm lexicografic.

Se dau QQ cerințe care pot fi de două tipuri:

  1. Tipul 1. Dată fiind o listă generată de o acoperire validă, să se determine a câta este această listă ca indice în ordinea lexicografică a tuturor listelor valide (cu indexare de la 1).
  2. Tipul 2. Dat fiind un indice KK, să se determine lista corespunzătoare acoperirii aflate pe poziția KK în ordinea lexicografică (cu indexare tot de la 1).

Date de intrare

Pe prima linie se va afla un singur număr întreg QQ, reprezentând numărul de cerințe.
Pe următoarele QQ linii se vor afla cerințele, având unul dintre următoarele două formate:

  • 11 LL x1x_1 x2x_2 \dots xLx_L: o cerință de tipul 2. Primul număr este 11, urmat de LL (lungimea listei), iar apoi de cele LL elemente ale listei.
  • 22 KK: o cerință de tipul 2. Primul număr este 22, urmat de indicele KK.

Date de ieșire

Se vor afișa QQ linii, reprezentând răspunsurile pentru fiecare cerință, în ordinea din fișierul de intrare:

  • Pentru o cerință de tipul 1, se va afișa un singur număr întreg KK, reprezentând indicele listei în ordinea lexicografică.
  • Pentru o cerință de tipul 2, se va afișa lungimea listei LL, urmată de cele LL elemente ale listei separate prin câte un spațiu.

Restricții

  • Q100 000Q \leq 100 \ 000
  • 1K10181 \leq K \leq 10^{18}
  • Pentru cerințele de tip 1 se garantează că lista dată provine dintr-o acoperire validă.
  • Pentru cerințele de tip 2 se garantează că există cel puțin KK acoperiri valide.
  • Ordinea lexicografică: O listă AA de lungime LAL_A este strict mai mică lexicografic decât o listă BB de lungime LBL_B dacă există o poziție ii astfel încât primele i1i-1 elemente sunt identice, iar Ai<BiA_i < B_i. Dacă nu există o astfel de poziție, dar LA<LBL_A < L_B și elementele coincid până la lungimea LAL_A, se consideră de asemenea că AA este mai mică lexicografic decât BB.
  • Deoarece trebuie citite multe numere, vă recomandăm folosirea std::ios_base::sync_with_stdio(false); std::cin.tie(0); ca primă linie în funcția main() , pentru a face citirea mai rapidă
# Scor Restricții
1 16 K2000K \le 2000 (inclusiv indicii listelor de la cerințele de tip 11)
2 19 Q1 000Q \leq 1 \ 000 și toate cerințele sunt de tipul 1
3 28 Q1 000Q \leq 1 \ 000 și toate cerințele sunt de tipul 2
4 23 Q1 000Q \leq 1 \ 000
5 14 Fără alte restricții

Exemplu

stdin

2
2 2
1 64 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

stdout

61 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1
1

Explicație

Pentru prima cerință, ni se cere lista corespunzătoare acoperirii aflate pe poziția 22 în ordinea lexicografică.
Prima acoperire posibilă (cea mai mică lexicografic, de pe poziția 11) este formată exclusiv din 64 de pătrate 1×11 \times 1.
Următoarea acoperire în ordine lexicografică este cea în care avem un singur pătrat 2×22 \times 2, iar pentru a păstra elementele de 11 cât mai mult timp la începutul listei, acest pătrat 2×22 \times 2 trebuie plasat cât mai târziu posibil pe tablă. Această poziție optimă este chiar colțul din dreapta-jos (ocupând intersecția ultimelor două linii cu ultimele două coloane).

Când parcurgem și transcriem această tablă:

  • Trecem prin primele 6 linii complet și prin primele 6 celule din linia 7: adăugăm la listă 54 de valori de 11.
  • Ajungem la pătratul de 2×22 \times 2 pe care abia acum îl întâlnim: adăugăm la listă o valoare de 2. (Următoarea celulă din rând este deja acoperită de acest pătrat, deci o sărim).
  • Trecem pe ultima linie. Primele 6 celule sunt libere: adăugăm încă 6 valori de 11. (Ultimele două celule sunt deja acoperite de pătratul 2×22 \times 2).

Astfel, obținem o listă de lungime 6161, formată din 5454 de 11, urmată de un 22, apoi de încă șase valori de 11.

Pentru a doua cerință, se dă lista formată din 6464 de elemente egale cu 11 și se cere poziția sa. Așa cum am dedus și anterior, aceasta este absolut prima acoperire din ordinea lexicografică, așadar răspunsul este 11.

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