Security

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

Cerință

Există NN obiecte numerotate 0,1,…,N−10, 1, \ldots, N - 1 și MM porți de securitate numerotate 0,1,…,M−10, 1, \ldots, M - 1. Fiecare poartă de securitate ii are asociată o submulțime secretă de obiecte A[i]A[i].

\\[0.25cm]

Poți trimite un pachet PP format dintr-o submulțime nevidă a celor NN obiecte. Pachetul trece prin porțile de securitate în ordine crescătoare. Poarta de securitate ii confiscă pachetul dacă ∣A[i]∩P∣|A[i] \cap P| este impar. Pachetul este oprit la prima poartă, care îl confiscă. După trimiterea pachetului sunteți anunțați despre indexul porții de securitate care l-a oprit.

\\[0.25cm]

Se garantează că fiecare pachet nevid este confiscat de una din porțile de securitate.

\\[0.25cm]

O poartă de securitate este numită utila˘\bold{utilă} dacă există un pachet pentru care această poartă este prima care îl confiscă. Se poate demonstra că există exact NN useful security gates. Fie indicii acestora, în ordine crescătoare:

c[0]<c[1]<…<c[N−1].c[0] < c[1] < \ldots < c[N - 1].

Misiunea ta este să trimiți pachetele astfel încât pentru orice 0≤i<N0 \leq i < N, poarta de securitate c[i]c[i] confiscă exact N−iN - i dintre pachetele trimise.

\\[0.25cm]

Poți alege fiecare pachet pe baza răspunsurilor obținute pentru pachetele trimise anterior.

Interacțiune

Programul nu va citi date de la intrare și nu va face afișări. Concurentul trebuie să implementeze funcția:

void solve(int N, int M)
  • NN: numărul de obiecte.
  • MM: numărul de porți de securitate.
  • Această funcție este apelată exact o singură dată pentru fiecare testcase.

Funcția solve() poate apela următoarea funcție:

int send_package(std::vector<int> P)
  • PP trebuie să conțină indicii unei submulțimi nevid de obiecte.
  • Procedura returnează indicele primei porți de securitate care confiscă PP.
  • Fiecare obiect poate apărea cel mult o singură dată în PP.

Modelul graderului este neadaptiv\bold{este \ neadaptiv}. Aceasta înseamnă că mulțimile A[0],A[1],…,A[M−1]A[0], A[1], \ldots, A[M - 1] sunt fixate înainte de apelul solve.

Exemplu

Presupunem că N=3N = 3 și M=4M = 4, iar submulțimile secrete sunt:

  • A[0]={0,1}A[0] = \{0, 1\}
  • A[1]={0,1}A[1] = \{0, 1\}
  • A[2]={1,2}A[2] = \{1, 2\}
  • A[3]={2}A[3] = \{2\}

În acest caz, porțile de securitate utile sunt 0,2,0, 2, și 33. Poarta 1 nu este utilă, deoarece orice pachet, pe care îl poate confisca aceasta, a fost deja confiscat de poarta 00.

\\[0.25cm]

O posiblă secvență de apeluri pentru send_package este:

Pachet P A returnat poarta
{0}\{0\} 00
{1}\{1\} 00
{0,2}\{0, 2\} 00
{0,1}\{0, 1\} 22
{2}\{2\} 22
{0,1,2}\{0, 1, 2\} 33

De exemplu, pachetul {0,1,2}\{0, 1, 2\} trece prin porțile 0,1,0, 1, și 2,2, deoarece intersecția lui cu fiecare dintre submulțimile lor are o dimensiune pară. El este mai apoi confcat de poarta 33.

\\[0.25cm]

În final, poarta 00 a confiscat 33 pachete, poarta 22 a confiscat 22 pachete, și poarta 33 a confiscat 11 package. pachet. Prin urmare, obiectivul a fost atins.

\\[0.25cm]

Nota˘:\bold{Notă:} Submulțimile secrete sunt prezentate doar pentru ilustrarea exempului. Ele nu sunt transmise către programul tău.

Restricții și precizări

  • 1≤N≤3001 \leq N \leq 300
  • N≤M≤2000N \leq M \leq 2000
  • Fiecare pachet nevid este confiscat de o careva poartă de securitate.
  • sunt exact NN porți de securitate utile.
Subtask Scor Restricții
1 7 A[i]={i}A[i] = \{i\} pentru fiecare 0≤i<M0 \leq i < M, și M=NM = N.
2 9 ∣A[i]∣=1\lvert A[i] \rvert = 1 pentru fiecare 0≤i<M0 \leq i < M.
3 6 ∣A[i]∣≤2\lvert A[i] \rvert \leq 2 pentru fiecare 0≤i<M0 \leq i < M, și ⋂0M−1A[i]≠∅\bigcap\limits_{0}^{M-1} A[i] \neq \emptyset.
4 14 ∣A[i]∣≤2\lvert A[i] \rvert \leq 2 pentru fiecare 0≤i<M0 \leq i < M.
5 31 A[i]={L[i],L[i]+1,…,R[i]}A[i] = \{L[i], L[i] + 1, \ldots, R[i]\} pentru fiecare 0≤i<M0 \leq i < M.
6 33 Fără restricții suplimentare.

Testare locală

Grader-ul local citește inputul în următorul format:

  • linia 1: N MN \ M
  • linia 2 + ii (0≤i<M0 \leq i < M): K A[i][0] A[i][1] … A[i][K−1]K \ A[i][0] \ A[i][1] \ \ldots \ A[i][K - 1]

Aici, KK este numărul de obiecte în mulțimea A[i]A[i].

\\[0.25cm]

Grader-ul local apelează solve(N, M) și simulează funcția send_package.

\\[0.25cm]

După ce solve se termină, grader-ul local printează unul dintre următoarele mesaje:

  • Correct dacă toate porțile utile au fost găsite și fiecare poartă utilă c[i]c[i] a confiscat exact N−iN - i pachete.
  • You did not find all useful gates dacă mai puțin de NN porți au confiscat cel puțin un pachet.
  • Wrong dacă toate porțile utile au fost găsite, dar numărul necesar de pachete nu a fost confiscat de fiecare dintre ele.
  • Invalid package if send_package este apelat cu un pachet nevalid. În acest caz, graderul local se închide imediat.

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