QOJ.ac

QOJ

Time Limit: 10 s Memory Limit: 512 MB Total points: 100 Difficulty: [show] Interactive Hackable ✓

#24229. Mus

Statistics

To zadanie jest interaktywne.

W przeddzień otwarcia festiwalu deserów szef kuchni starannie dopracowuje popisowy deser swojej cukierni — „千层幻彩慕斯”. Deser składa się z $n$ kawałków musu o różnych smakach, ponumerowanych kolejno $0,1,\dots,n-1$.

Jednak w zamieszaniu pomocnik przypadkowo pomylił kolejność kawałków musu. Teraz są one ustawione w jednym rzędzie od lewej do prawej, tworząc nieznaną permutację położeń $p=(p_0,p_1,\dots,p_{n-1})$, gdzie $p_i$ oznacza numer kawałka musu znajdującego się na pozycji $i$.

Aby ustalić dokładne położenie każdego kawałka musu, możesz korzystać z urządzenia do badania deserów. Za każdym razem wybierasz trzy parami różne pozycje $x,y,z$, a urządzenie zwraca sumę najmniejszego i największego numeru spośród tych trzech kawałków musu:

$$ \min(p_x,p_y,p_z)+\max(p_x,p_y,p_z). $$

Już wkrótce rozlegnie się dzwon oznajmiający otwarcie. Czy potrafisz za pomocą ograniczonej liczby badań dokładnie odtworzyć rzeczywiste położenie każdego kawałka musu?


Dana jest permutacja $p$ długości $n$, której elementami są dokładnie $0,1,\ldots,n-1$. Nie znasz zawartości $p$.

Możesz wybrać trzy parami różne indeksy $x,y,z$, a biblioteka interaktywna zwróci

$$ \min(p_x,p_y,p_z)+\max(p_x,p_y,p_z). $$

Twoim zadaniem jest odtworzenie całej permutacji. Limit liczby zapytań oraz sposób obliczania wyniku na podstawie liczby zapytań opisano poniżej.

Szczegóły implementacji

Nie musisz i nie powinieneś implementować funkcji main. Przesyłany plik źródłowy powinien zawierać:

#include "mousse.h"

Należy zaimplementować następujące dwie funkcje:

void init(int c);
std::vector<int> mousse(int c, int n);
  • $c$ jest numerem podzadania; $c=0$ oznacza przykład. Każdy test zawiera dokładnie jedną instancję zadania. Biblioteka interaktywna wywołuje dla tego testu raz init(c), a następnie raz mousse(c,n).
  • mousse powinno zwrócić tablicę długości $n$, w której element o indeksie $i$ jest równy $p_i$. Indeksy zaczynają się od $0$.

Aby wykonać jedno zapytanie, możesz wywołać następującą funkcję:

int query(int x, int y, int z);

Musi zachodzić $0\le x,y,z < n$, a $x,y,z$ muszą być parami różne. Funkcja zwraca $\min(p_x,p_y,p_z)+\max(p_x,p_y,p_z)$.

Testowanie programu

Załączniki zawierają mousse.h, lokalną bibliotekę interaktywną grader.cpp oraz przykładowy program template_mousse.cpp. Zapisz swój program jako mousse.cpp; w katalogu tego zadania możesz uruchomić:

g++ grader.cpp mousse.cpp -o mousse -O2 -std=c++14
./mousse < mousse1.in

Lokalna biblioteka interaktywna odczytuje ukrytą permutację ze standardowego wejścia. Program uczestnika nie może samodzielnie odczytywać tych danych. Format wejścia jest następujący:

  • Pierwszy wiersz zawiera dwie liczby całkowite $c,n$.
  • Drugi wiersz zawiera $p_0,p_1,\ldots,p_{n-1}$.

Jeśli odpowiedź jest poprawna, biblioteka interaktywna wypisuje Correct! oraz Max queries used: Q, gdzie $Q$ jest liczbą zapytań wykonanych w tym teście. Jeśli odpowiedź jest błędna, wypisuje Wrong answer.. W przypadku niedozwolonego zapytania lub przekroczenia limitu liczby zapytań program wypisuje komunikat o błędzie na standardowy strumień błędów i kończy działanie. Możesz dodać argument -v, aby zobaczyć liczbę zapytań wykonanych w tym teście.

Przykład

Wejście 1

0 10
0 2 9 1 5 8 3 7 6 4

Wyjście 1

Correct!
Max queries used: 15

Uwagi

Na przykład po wywołaniu query(0,1,2) trzy odpowiadające wartości to $0,2,9$, więc funkcja zwraca $0+9=9$. Program wzorcowy wykonuje dla tych danych $15$ zapytań. Przy zastosowaniu innej strategii liczba ta może być inna.

Ograniczenia

Dla wszystkich danych testowych $n\in\{10,100,10^5\}$, a $p$ jest permutacją liczb $0\sim n-1$. Każdy test zawiera dokładnie jedną instancję zadania.

Numer podzadania Punkty $n =$ $Q_{\max} = $ Dodatkowa własność
$1$ $5$ $10$ $1000$ Brak
$2$ $5$ $100$ $10000$ Brak
$3$ $30$ $10^5$ $2\times10^6$ $p_0=0$
$4$ $60$ $10^5$ $2\times10^6$ Brak

Dla przykładu $c=0$, $n=10$, a limit liczby zapytań wynosi $1000$.

Podzadania

Uwaga:

  • Biblioteka interaktywna nie jest adaptacyjna. Permutacja dla każdego testu jest ustalona przed wywołaniem programu uczestnika i nie zmienia się w zależności od zapytań.
  • Nie wolno uzyskiwać ukrytej permutacji przez odczytywanie standardowego wejścia ani w żaden inny niedozwolony sposób. Implementacja biblioteki interaktywnej używanej podczas ostatecznej oceny może różnić się od implementacji biblioteki lokalnej.

Jeżeli w pewnym teście mousse zwróci błędną odpowiedź, argumenty query będą nieprawidłowe lub liczba zapytań przekroczy $Q_{\max}$ dla danego podzadania, mnożnik wyniku dla tego testu wyniesie $0$.

W podzadaniach $1,2$ pełną liczbę punktów za podzadanie można otrzymać tylko wtedy, gdy odpowiedzi we wszystkich testach są poprawne.

W podzadaniach $3,4$, jeśli mnożnik wyniku w którymkolwiek teście wynosi $0$, za całe podzadanie otrzymuje się $0$ punktów. W przeciwnym razie niech $Q$ oznacza największą liczbę zapytań spośród wszystkich testów danego podzadania. Mnożnik wyniku $f(Q)$ jest określony przez poniższą tabelę:

Liczba zapytań $Q_i$ Mnożnik wyniku $f_i$
$99970$ $100\%$
$99975$ $98\%$
$99981$ $95\%$
$99988$ $90\%$
$99996$ $84\%$
$100000$ $80\%$
$100010$ $74\%$
$100026$ $66\%$
$100051$ $58\%$
$100093$ $52\%$
$150000$ $32\%$
$200000$ $20\%$
$1660964$ $8\%$
$2000000$ $5\%$

Jeśli $Q\le 99970$, to $f(Q)=100\%$. Jeśli $Q$ leży pomiędzy dwoma sąsiednimi wierszami tabeli $(Q_i,f_i)$ i $(Q_{i+1},f_{i+1})$, to:

$$ f(Q)=f_i+\frac{Q-Q_i}{Q_{i+1}-Q_i}(f_{i+1}-f_i). $$

Wynik za podzadanie $3$ wynosi $30f(Q)$, a za podzadanie $4$ wynosi $60f(Q)$. Ostateczny wynik jest zaokrąglany do $3$ miejsc po przecinku.

Limit czasu: $10\ \mathrm{s}$.

Limit pamięci: $512\ \mathrm{MiB}$.

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#2924EditorialOpenNew Editorial for Problem #24229wangmaruiView

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.