QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 256 MB 満点: 100 難易度: [表示]

#18232. APLSPC

統計

Witamy w SFLSPC!

Tło zadania

W Antarktycznej Szkole Języka Pingwinów (Antarctica Penguin Language School) pingwiny co roku trenują, jak optymalizować kod i skracać czas jego wykonywania.

Pewien pingwin o imieniu „oo” jest szpiegiem wysłanym przez Szkołę Języka Niedźwiedzi Polarnych z Oceanu Arktycznego! Spenetrował on zawody, próbując zamienić APLS w kolonię niedźwiedzi polarnych!

Pewien pracowity i odważny pingwin nie tylko udaremnił wywrotowe plany złych arktycznych pingwinów, ale także przygotował wszystkie dane do APLSPC. Powiedzmy: dziękujemy pingwinowi.

Pewien wielki pingwin, który jest bardzo wielki, jest cesarzem Antarktycznej Szkoły Języka Pingwinów.

Pewien pingwin „dudu” jest bardzo „dudu”. Wysłał ci materiały do nauki „dudu-dudu”, wymagając, abyś się ich nauczył.

Pewien słodki pingwin napisał kod o złożoności $O(n\log n)$, który nie mieści się w limicie czasu 2s dla $n\le 5\times 10^5$. Jest bardzo zły i postanowił zemścić się na społeczeństwie, tworząc to zadanie.

Musisz napisać kod, który dla wymaganych języków spełnia następujące warunki:

  1. W ramach instrukcji kompilacji dla danego języka, kod musi działać poprawnie i wypisywać własną treść źródłową.
  2. W sensie dopasowania całych słów (ang. full-word matching), kod nie może zawierać żadnych słów kluczowych danego języka (jeśli nie wiesz, czym jest dopasowanie całych słów, zapoznaj się z sekcją szczegółów oceny).

Oba te wymagania muszą być spełnione zarówno dla C++, jak i dla Pythona. Oznacza to, że ten sam kod musi być poprawnym kodem w C++ oraz w Pythonie i spełniać powyższe warunki.

Przy tym założeniu twój kod powinien być tak krótki, jak to tylko możliwe.

Jeśli twój kod spełnia wszystkie warunki, a jego długość nie przekracza 250B, otrzymasz 100 punktów. Jeśli twój kod nie spełnia wszystkich warunków, nadal możesz otrzymać pewną liczbę punktów – szczegóły znajdują się w sekcji dotyczącej punktacji.

Uwaga: Zastosujemy środki techniczne, aby w katalogu roboczym podczas uruchamiania kodu nie było pliku źródłowego. Nie możesz i nie powinieneś próbować odczytywać pliku źródłowego w celu wykonania zadania.

Jeśli nie znasz składni, możesz odwiedzić python.org lub cppreference.com, aby uzyskać odpowiednie informacje.

Szczegóły oceny

Twój kod nie może zawierać znaków spoza standardu ASCII, w przeciwnym razie wynik jest niezdefiniowany.

Po pierwsze, wszystkie znaki końca linii w twoim kodzie zostaną wymuszone jako CRLF (\r\n), więc każdy znak końca linii zajmuje dwa bajty.

Następnie system oceniający wywoła następujące instrukcje, aby uruchomić twój kod:

/usr/bin/g++ code.cpp -std=c++2a -O2 -o code && ./code
python3 code.cpp

Następnie system oceniający użyje poniższej instrukcji, aby sprawdzić, czy twój kod wypisuje własną treść:

diff --strip-trailing-cr code.cpp out

Ta instrukcja traktuje CRLF na końcu linii jako LF, co oznacza, że nie musisz martwić się o specjalne znaki końca linii przy wypisywaniu.

Poza tym, instrukcja ta przeprowadza całkowicie rygorystyczne porównanie, co oznacza, że znaki białe, takie jak spacje na końcu linii, muszą być identyczne.

Na koniec system oceniający sprawdzi, czy twój kod zawiera słowa kluczowe, używając dopasowania całych słów. Definicja dopasowania całych słów oznacza, że znaki bezpośrednio przed i po dopasowanym słowie nie mogą być cyframi, literami ani podkreśleniami. Na przykład int może pasować do (int), ale nie do print. Listy słów kluczowych znajdują się na końcu zadania.

Należy zwrócić szczególną uwagę na to, że podany limit czasu jest nieistotny, rzeczywisty limit wynosi 1000ms. Jeśli twój kod będzie działał dłużej niż 1000ms, zostanie przymusowo zakończony, jednak czas wykonania i zużycie pamięci nie będą odzwierciedlone w wyniku oceny.

Punktacja

Zdefiniujmy wynik wstępny $s_0$:

  • Niezależnie od tego, czy kod zawiera słowa kluczowe: jeśli kod jest poprawnym kodem C++, wypisuje własną treść w C++, ale nie jest poprawnym kodem w Pythonie, $s_0=2$.

  • Niezależnie od tego, czy kod zawiera słowa kluczowe: jeśli kod jest poprawnym kodem zarówno w C++, jak i w Pythonie, wypisuje własną treść w C++, ale nie w Pythonie, $s_0=10$.

  • Niezależnie od tego, czy kod zawiera słowa kluczowe: jeśli kod jest poprawnym kodem zarówno w C++, jak i w Pythonie oraz wypisuje własną treść w obu językach, niech $x$ oznacza długość twojego kodu:

$$ s_0=f(x)= \begin{cases} 20&(x\ge10^4)\\ 45-\frac{x}{400}&(2000\le x<10^4)\\ \frac{200}{3}-\frac{x}{75}&(500\le x<2000)\\ 135-\frac{3x}{20}&(300\le x<500)\\ 150-\frac{x}{5}&(x<300) \end{cases} $$

  • W pozostałych przypadkach $s_0=0$.

$f(x)$ jest funkcją ciągłą. Zauważ, że $s_0$ może przekroczyć 100.

Ostatecznie, jeśli twój kod nie zawiera słów kluczowych, twój wynik końcowy wynosi $\lfloor\min(100,s_0)\rfloor$, w przeciwnym razie wynosi $\lfloor\min(70,0.7s_0)\rfloor$.

Listy słów kluczowych

Lista słów kluczowych C++:

{
    "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break",
    "case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept",
    "const", "consteval", "constexpr", "constinit", "const_cast", "continue", "co_await",
    "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast",
    "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto",
    "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq",
    "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register",
    "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static",
    "static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this",
    "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned",
    "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
}

Lista słów kluczowych Pythona:

{
    "False", "None", "True", "and", "as", "assert", "async", "await", "break", "class",
    "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global",
    "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return",
    "try", "while", "with", "yield", "match", "case"
}

Wskazówki

  • Funkcja main w C++ może nie mieć zdefiniowanego typu zwracanego. Oznacza to, że poniższy kod jest poprawnym kodem w C++:
main(){}

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.