QOJ.ac

QOJ

时间限制: 10 s 内存限制: 512 MB 总分: 100 交互

#13468. Landlord

统计

To jest zadanie interaktywne.

Wierzymy, że nie widzieliście CZL od kilku miesięcy, ale on powraca! Udało nam się umieścić małego U, małego Z oraz CZL w jednym zestawie zadań.

CZL posiada potasowaną talię kart. Talia składa się z $n$ kart ułożonych od góry do dołu (pozycje kart są numerowane od $0$ do $n-1$). Wartości kart to liczby ze zbioru $\{0, 1, 2, \dots, n-1\}$, przy czym każda wartość występuje dokładnie raz. Twoim zadaniem jest odgadnięcie wartości każdej karty w talii, ale wielki magik nie zdradzi ci ich tak po prostu.

Na początku lewa i prawa ręka CZL znajdują się na pozycji karty $0$. W każdym ruchu możesz nakazać mu przesunięcie lewej ręki o jedną kartę w górę lub w dół. Możesz również nakazać mu przesunięcie prawej ręki o jedną kartę w górę lub w dół. Możesz także zapytać, czy karta pod lewą ręką jest mniejsza od karty pod prawą ręką. Dzięki tym operacjom musisz ustalić wartość każdej karty w talii, od góry do dołu.

Choć ręce CZL są bardzo sprawne, musi on jeszcze wykonywać sztuczki dla innych osób. Dlatego prosimy, abyś ustalił wartości wszystkich kart, wykonując nie więcej niż $7,0 \cdot 10^8$ ruchów.

Twój kod musi zawierać nagłówek "lancllords.h". Musisz zaimplementować funkcję:

vector<int> answer(int n);

W tej funkcji liczba całkowita $n$ oznacza liczbę kart. Funkcja powinna zwrócić tablicę $P$ o długości $n$, gdzie P[i] oznacza wartość karty na $i$-tej pozycji od góry.

Zakładamy, że lewa ręka CZL znajduje się na pozycji $p$, a prawa na pozycji $q$. Możesz wywoływać następujące funkcje:

void inc_p();

Przesuwa lewą rękę CZL o jedną kartę w dół.

void dec_p();

Przesuwa lewą rękę CZL o jedną kartę w górę.

void inc_q();

Przesuwa prawą rękę CZL o jedną kartę w dół.

void dec_q();

Przesuwa prawą rękę CZL o jedną kartę w górę.

bool cmp();

Porównuje wartość karty na pozycji $p$ z wartością karty na pozycji $q$. Zwraca true, jeśli karta na pozycji $p$ jest mniejsza od karty na pozycji $q$, w przeciwnym razie zwraca false.

Za każdym razem, gdy wywołasz jedną z pierwszych czterech funkcji, zmienna cnt w graderze zwiększy się o $1$. Podczas końcowej oceny, jeśli wartość cnt będzie zbyt duża, test zostanie uznany za niezaliczony. Musisz zawsze dbać o to, aby $0 \le p, q < n$, w przeciwnym razie test również zostanie uznany za niezaliczony.

Pamiętaj, że biblioteka interakcyjna działa w czasie nieprzekraczającym pięciu sekund, pod warunkiem, że liczba wywołań pierwszych czterech funkcji nie przekracza $7,0 \cdot 10^8$, a liczba wywołań piątej funkcji nie przekracza $10^7$. Oznacza to, że Twój kod ma co najmniej pięć sekund czasu wykonania.

Dostarczamy pliki grader.cpp oraz lancllords_sample.cpp, gdzie lancllords_sample.cpp jest przykładowym rozwiązaniem. Możesz przetestować swój program za pomocą polecenia g++ lancllords.cpp grader.cpp -o lancllords -O2.

Wejście

W pierwszej linii znajduje się liczba całkowita $n$, oznaczająca liczbę kart.

W kolejnej linii znajduje się $n$ liczb $P_0, \dots, P_{n-1}$, oznaczających wartości kart od góry do dołu.

Wyjście

Informacje są wyprowadzane przez bibliotekę interakcyjną. Podczas testów lokalnych, jeśli wartości $p$ lub $q$ wyjdą poza zakres, zostanie wypisane "Out of bound!". Jeśli zwrócisz błędną odpowiedź, zostanie wypisane "Wrong answer!", w przeciwnym razie zostanie wypisane "Right Output!" oraz w kolejnej linii liczba wywołań pierwszych czterech funkcji.

Biblioteka interakcyjna dostarczona w plikach różni się od tej używanej w finalnej ocenie! Jednak w finalnym systemie testującym permutacja jest generowana z góry i nie zmienia się w zależności od Twoich zapytań.

Przykład

Przykład 1 Wejście

5
3 4 0 1 2

Przykład 1 Wyjście

Right Output!
You use 100 operations!

Uwagi

Ten przykład oznacza, że wywołałeś pierwsze cztery funkcje 100 razy i uzyskałeś poprawną permutację.

Przykład 2

Patrz dostarczone pliki.

Przykład 3

Patrz dostarczone pliki.

Podzadania

Dla wszystkich danych $1 \le n \le 150000$.

Podzadanie $1$ ($6$ pkt): $n \le 1000$

Podzadanie $2$ ($7$ pkt): $n \le 10000$

Podzadanie $3$ ($38$ pkt): $n \le 30000$

Podzadanie $4$ ($25$ pkt): $n \le 50000$

Podzadanie $5$ ($24$ pkt): $n \le 150000$

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.