QOJ.ac

QOJ

時間限制: 1 s 記憶體限制: 256 MB 總分: 100 难度: [顯示]

#18232. APLSPC

统计

Chào mừng các bạn đến với SFLSPC!

Bối cảnh bài toán

Tại Trường Ngôn ngữ Chim cánh cụt Nam Cực (Antarctica Penguin Language School - APLS), hàng năm các chú chim cánh cụt đều luyện tập cách tối ưu hóa mã nguồn và kỹ thuật "cắt giảm" thời gian chạy (card-sang).

Có một chú chim cánh cụt "oo" là gián điệp được phái đến từ Trường Ngôn ngữ Gấu Bắc Cực ở Bắc Băng Dương! Nó đã thâm nhập vào cuộc thi này với âm mưu biến APLS thành thuộc địa của loài gấu Bắc Cực!

Có một chú chim cánh cụt chăm chỉ và dũng cảm, không chỉ ngăn chặn kế hoạch lật đổ của lũ chim cánh cụt Bắc Cực độc ác, mà còn tạo ra toàn bộ dữ liệu cho APLSPC. Hãy nói: Cảm ơn chim cánh cụt.

Có một chú chim cánh cụt vĩ đại, nó rất vĩ đại, là Đại đế của Trường Ngôn ngữ Chim cánh cụt Nam Cực.

Có một chú chim cánh cụt "dudu", nó rất "dudu". Nó đã gửi cho bạn tài liệu học tập "dududu" và yêu cầu bạn phải học.

Có một chú chim cánh cụt "tangtang", mã nguồn $O(n\log n)$ mà nó viết không thể vượt qua giới hạn thời gian 2 giây với $n \le 5 \times 10^5$. Nó rất tức giận và quyết định trả thù xã hội, vì vậy nó đã tạo ra bài toán này.

Mô tả bài toán

Bạn cần viết một đoạn mã nguồn, đối với các ngôn ngữ được yêu cầu, phải thỏa mãn:

  1. Dưới các lệnh biên dịch của ngôn ngữ đó, mã nguồn có thể chạy bình thường và xuất ra chính nó;
  2. Theo nghĩa khớp toàn bộ từ (full-word matching), mã nguồn không được chứa bất kỳ từ khóa nào của ngôn ngữ đó (nếu bạn không biết khớp toàn bộ từ là gì, vui lòng tham khảo phần Chi tiết chấm bài).

Hai yêu cầu này phải được thỏa mãn cho cả C++ và Python. Nói cách khác, đoạn mã này phải vừa là mã C++ hợp lệ, vừa là mã Python hợp lệ, đồng thời thỏa mãn các yêu cầu trên.

Trên cơ sở đó, mã nguồn của bạn cần phải càng ngắn càng tốt.

Nếu mã nguồn của bạn thỏa mãn tất cả các điều kiện và có độ dài không quá 250B, bạn sẽ nhận được 100 điểm. Nếu mã nguồn của bạn không thỏa mãn một số điều kiện, bạn vẫn có thể nhận được một số điểm nhất định, chi tiết xem tại phần Cách tính điểm.

Lưu ý: Chúng tôi sẽ sử dụng các biện pháp để đảm bảo rằng trong thư mục chạy mã nguồn của bạn không có tệp mã nguồn gốc, bạn không thể và không nên sử dụng các cách như gọi tệp mã nguồn để hoàn thành nhiệm vụ.

Nếu bạn không quen thuộc với cú pháp, bạn có thể truy cập python.org hoặc cppreference.com để biết thêm thông tin.

Chi tiết chấm bài

Mã nguồn của bạn không được chứa các ký tự không phải ASCII, nếu không kết quả sẽ không xác định.

Trước hết, tất cả các ký tự xuống dòng trong mã nguồn của bạn sẽ bị ép buộc chuyển thành CRLF (\r\n), vì vậy một lần xuống dòng sẽ chiếm hai byte.

Tiếp theo, hệ thống chấm bài sẽ lần lượt gọi các lệnh sau để chạy mã nguồn của bạn:

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

Sau đó, hệ thống chấm bài sẽ sử dụng lệnh sau để kiểm tra xem mã nguồn của bạn có xuất ra chính nó hay không:

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

Lệnh này coi CRLF ở cuối dòng là LF, nghĩa là bạn không cần quan tâm đến ký tự xuống dòng đặc biệt khi xuất ra.

Ngoài ra, lệnh này sẽ thực hiện so sánh hoàn toàn nghiêm ngặt, nghĩa là các ký tự trắng như khoảng trắng ở cuối dòng cũng phải hoàn toàn khớp.

Cuối cùng, hệ thống chấm bài sẽ tìm kiếm xem mã nguồn của bạn có chứa từ khóa nào từ danh sách từ khóa hay không, phương thức tìm kiếm là khớp toàn bộ từ. Định nghĩa của khớp toàn bộ từ là: các ký tự ngay trước và sau vị trí khớp không được là chữ số, chữ cái hoặc dấu gạch dưới. Ví dụ: int có thể khớp với (int), nhưng không thể khớp với print. Danh sách từ khóa được đính kèm ở cuối bài toán.

Cần đặc biệt lưu ý rằng giới hạn thời gian được ghi chú là vô nghĩa, giới hạn thực tế là 1000ms. Nếu mã nguồn của bạn chạy quá 1000ms, nó sẽ bị buộc dừng, nhưng thời gian chạy và bộ nhớ sẽ không phản ánh vào kết quả chấm bài.

Cách tính điểm

Xác định điểm sơ bộ $s_0$ của bạn:

  • Bất kể mã nguồn có chứa từ khóa hay không, nếu mã nguồn của bạn là mã C++ hợp lệ và xuất ra chính nó khi chạy bằng C++, nhưng không phải là mã Python hợp lệ, $s_0=2$.

  • Bất kể mã nguồn có chứa từ khóa hay không, nếu mã nguồn của bạn vừa là mã C++ vừa là mã Python hợp lệ, và xuất ra chính nó khi chạy bằng C++, nhưng không xuất ra chính nó khi chạy bằng Python, $s_0=10$.

  • Bất kể mã nguồn có chứa từ khóa hay không, nếu mã nguồn của bạn vừa là mã C++ vừa là mã Python hợp lệ và xuất ra chính nó trong cả hai ngôn ngữ, gọi $x$ là độ dài mã nguồn của bạn:

$$ 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} $$

  • Trong các trường hợp khác, $s_0=0$.

$f(x)$ là hàm liên tục. Lưu ý rằng $s_0$ có thể lớn hơn 100.

Cuối cùng, nếu mã nguồn của bạn không chứa từ khóa, điểm số cuối cùng của bạn là $\lfloor\min(100,s_0)\rfloor$, ngược lại là $\lfloor\min(70,0.7s_0)\rfloor$.

Danh sách từ khóa

Dưới đây là danh sách từ khóa của 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"
}

Dưới đây là danh sách từ khóa của Python:

{
    "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"
}

Gợi ý

  • Hàm main trong C++ có thể không cần định nghĩa kiểu trả về. Nghĩa là, đoạn mã sau là một đoạn mã C++ hợp lệ:
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.