Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2025-08-22 21:04:46.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:keymess.in, keymess.outSursăJunior Challenge 2025
AutorAdăugată deTurcanu_DavidTurcanu David Turcanu_David
Timp execuţie pe test3 secLimită de memorie131072 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Keymess

În tărâmul Ooo, esti trimis intr-o misiune prin Labirintul Bitilor, unde fiecare poarta este incuiata cu o cheie magica. Exista exact n chei, fiecare inscriptioanta cu un numar de la 0 la n-1. Dar, evident, cineva le-a amestecat complet.

Singura ta unealta este o masinarie ciudata si pe jumatate stricata, numita Oracolul Bitwise.

Daca ii oferi doua chei diferite i si j, in loc sa iti spuna exact ce sunt, masinaria va spune AND-ul bitwise al numerelor lor:
query(i, j) = a[i] & a[j]

Sarcina ta: Reconstruieşte intreaga permutare amestecata de chei a1, a2, .. an folosind numarul minim posibil de intrebari catre Oracol.

Date de intrare

Pe prima linie se află T, numărul de teste. Descrierea fiecarui test este urmatoarea:

Prima si singura linie a fiecarui test contine un intreg N

Pentru fiecare test:

  • Pe prima linie se află N, K.

Interactiunea

Interactiunea pentru fiecare test incepe cand numarul N este citit.

Pentru a face un query, se afiseaza o linie in urmatorul format:
* ? i j
După fiecare astfel de query interactorul vă va răspunde în stdin cu numarul (a[i] & a[j]).

Pentru a da un raspuns, se afiseaza o linie in urmatorul format:
* ! a1 a2 ... an
Raspunsul nu este va fi considerat la numarul de query-uri.

Dupa aceea, continuati la urmatorul test sau terminati programul daca este ultimul test.

Interactorul nu este adaptiv, ceea ce inseamna ca permutarea este predeterminata.

Dupa ce printati fiecare query, nu uitati sa afisati end of line si sa dati flush la output. Altfel veti primi verdictul de "Walltime limit exceeded".

Daca, la orice pas al interactiunii, cititi -1 in loc de date valide, solutia voastra va primi verdictul de "Query invalid" din cauza unui query invalid sau orice altei greseli.

Restricţii

Există un singur test cu urmatoarele date:

  • T = 20
  • N = 2^13

Functia care determina punctajul este urmatoarea:

Fie qs = numarul de query-uri

Numar query-uriPunctaj
qs ≤ 16700100
16700 < qs ≤ 17700e^((1000 - (qs - 16700)) / 334) + 80
17700 < qs ≤ 90000(-71 / 72300) * qs + (23798 / 241)
qs > 9000010

Operatorul de conjuncţie biţi & (AND) este un operator binar care are ca rezultat numărul obţinut prin conjuncţia fiecărei perechi de biţi ce apar în reprezentare în memorie a operanzilor:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

  • Pentru a da flush, puteti folosi:

fflush(stdout) sau cout.flush() in C++;
sys.stdout.flush() in Python;
verificati documentatia pentru alte limbaje de programare

Exemplu

stdinstdoutExplicaţie
1Se citeste T
4Se citeste N
? 1 2Query cu i = 1, j = 2
0Se raspunde ca (a1 & a2) = 0
! 0 1 2 3Programul a presupus ca a gasit permutarea si a raspuns
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?