Underrated

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

Cerință

La concursul Stelele Informaticii există NN participanți, numerotați 0,1,…,N−10, 1, \ldots, N - 1.

\\[0.25cm]

După concurs, participanții sunt clasați conform unei permutări secrete PP a numerelor 0,1,…,N−10, 1, \ldots, N - 1, unde P[i]P[i] reprezintă poziția participantului ii în clasamentul secret. Poziția 00 corespunde primului loc. Álec Sdima cunoaște clasamentul secret, dar tu nu îl cunoști.

\\[0.25cm]

Poți propune un clasament QQ, care trebuie să fie o permutare a numerelor 0,1,…,N−10, 1, \ldots, N - 1, unde Q[i]Q[i] reprezintă poziția pe care o atribui participantului ii. Se numește underrating-ul participantului ii, în clasamentul propus, valoarea Q[i]−P[i]Q[i] - P[i].

\\[0.25cm]

După ce vede clasamentul propus de tine, Álec îți comunică valoarea maximă a underrating-ului tuturor participanților, definită astfel:

max⁡0≤i<N(Q[i]−P[i])\max\limits_{0 \leq i < N} (Q[i] - P[i])

Trebuie să determini clasamentul secret PP folosind cât mai puține propuneri.

Interacțiune

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

std::vector<int> find_ranking(int N)
  • NN: numărul de participanți.
  • Funcția trebuie să returneze clasamentul secret PP.
  • Funcția este apelată o singură dată pentru fiecare test case.
  • Funcția find_ranking() poate apela următoarea funcție:
int ask(std::vector<int> Q)
  • QQ trebuie să fie o permutare a numerelor 0,1,…,N−10, 1, \ldots, N - 1.
  • Q[i]Q[i] reprezintă poziția atribuită participantului ii.
  • Funcția returnează valoarea:
max⁡0≤i<N(Q[i]−P[i])\max\limits_{0 \leq i < N} (Q[i] - P[i])
  • Această funcție poate fi apelată de cel mult 20,00020,000 de ori în fiecare test case.

Comportamentul grader-ului este adaptiv\bold{adaptiv}. Aceasta înseamnă că grader-ul nu folosește o permutare fixă PP. În schimb, valorile returnate de funcția ask depind de apelurile anterioare ale acesteia.

\\[0.25cm]

Se garantează că grader-ul răspunde astfel încât, după fiecare apel, să existe cel puțin o permutare PP compatibilă cu toate răspunsurile oferite până în acel moment.

Restricții

  • 1≤N≤10001 \leq N \leq 1000
  • PP este o permutare a numerelor 0,1,…,N−10, 1, \ldots, N - 1.

Precizări

  • Dacă, în oricare dintre test case-uri, funcția ask este apelată cu un argument care nu respectă regulile precizate mai sus sau permutarea returnată de find_ranking este incorectă, punctajul obținut pentru acel test case va fi 00.
  • Fie QQ numărul maxim de apeluri ale funcției ask efectuate într-un test case. Definim, de asemenea, valoarea XX astfel:
X=min⁡(1,21+(1997Q)3/2).X = \min\left(1, \frac{2}{1+\left(\frac{1997}{Q}\right)^{3/2}}\right).

Punctajul se calculează după cum urmează:

Subtask Scor Restricții
1 10 N≤100N \leq 100
2 90⋅X90 \cdot X N=1000N = 1000

În particular, pentru a obține 100 de puncte, soluția ta trebuie să efectueze cel mult 1 9971 \ 997 de apeluri ale funcției ask în fiecare test case. Punctajul fiecărui subtask este rotunjit la două zecimale.

Exemplu

Să presupunem că N=4N = 4, iar clasamentul secret este P=[2,0,3,1]P = [2, 0, 3, 1]. Aceasta înseamnă că participantul 11 ocupă primul loc, participantul 33 ocupă locul al doilea, participantul 00 ocupă locul al treilea, iar participantul 22 ocupă locul al patrulea.

\\[0.25cm]

Să considerăm următorul apel:

ask({0, 1, 2, 3})

Pentru acest clasament, valorile Q[i]−P[i]Q[i] - P[i] sunt [−2,1,−1,2][-2, 1, -1, 2]. Prin urmare, valoarea maximă a underrating-ului este 22, iar funcția returnează 22.

\\[0.25cm]

Să considerăm acum următorul apel:

ask({3, 0, 2, 1})

Valorile Q[i]−P[i]Q[i] - P[i] sunt [1,0,−1,0][1, 0, -1, 0]. Prin urmare, funcția returnează 11.

\\[0.25cm]

În cele din urmă, dacă clasamentul propus coincide cu cel secret,

ask({2, 0, 3, 1})

toate valorile Q[i]−P[i]Q[i] - P[i] sunt 00, astfel că funcția returnează 00.

Sample grader

Sample grader-ul este neadaptiv\bold{neadaptiv}. Clasamentul secret PP este fixat înainte de apelarea funcției find_ranking.

\\[0.25cm]

Sample grader-ul citește datele de intrare în următorul format:

Linia 1: NN

\\[0.25cm]

Linia 2: P[0] P[1] … P[N−1]P[0] \ P[1] \ \ldots \ P[N - 1]

\\[0.25cm]

Pentru fiecare apel al funcției ask(Q), sample grader-ul returnează valoarea:

max⁡0≤i<N(Q[i]−P[i])\max\limits_{0 \leq i < N} (Q[i] - P[i])

Sample grader-ul afișează datele de ieșire în următorul format:

  • Linia 1: CC
  • Linia 2: R[0] R[1] … R[N−1]R[0] \ R[1] \ \ldots \ R[N - 1]

Aici CC reprezintă numărul de apeluri ale funcției ask, iar RR este permutarea returnată de find_ranking.

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