HƯỚNG DẪN: LOGICA
===
🎊🎉🎊🎉🎊🎉
Chào mừng các thành viên của ==Team Logica==!
Các bạn là ==đầu não== - những người đóng vai trò quan trọng nhất trong sự hình thành, và bây giờ là phát triển, của [The Algitect (ALGI Project)](https://www.facebook.com/algitect.project).
... Vậy nên, hãy cùng cố gắng nhé! Tất cả vì một nền Tin học của tỉnh Bà Rịa - Vũng Tàu ngày một phát triển!
[toc]
Khái quát công việc
---
Nhiệm vụ của một thành viên ==Team Logica== bao gồm (nhưng không bị giới hạn bởi):
- ==Giải bài== (bao gồm **viết code** và **giải thích thuật toán**).
VD: [Lời giải đề HSG9 tỉnh Bà Rịa - Vũng Tàu (NH: 2015 - 2016)](https://hackmd.io/@algitect/hsg9brvt2016).
- ==Soạn bài== (bao gồm **viết đề bài** và **sinh test chấm** và **giải bài**)
VD: Thi thử HSG, Thi thử Tuyển sinh, ...
- ==Hỗ trợ các thành viên trong diễn đàn==
VD: Trả lời các thắc mắc, giải bài giúp, ...
>[!Important]
> Dự án sử dụng trình chấm bài ==Codeforces==, soạn bài bằng [Polygon](https://polygon.codeforces.com/).
>
> Lời giải và các tài liệu khác được viết và xuất bản bằng [HackMD](https://hackmd.io/).
>
> Khi viết các biểu thức toán học trên cả hai nền tảng đều cần sử dụng [MathJax](https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference).
> Tham khảo thêm: [LINK](https://en.wikibooks.org/wiki/LaTeX/Mathematics).
Hướng dẫn sử dụng Polygon để soạn bài trên Codeforces
---
### Đăng ký tài khoản
[ĐĂNG KÝ TẠI ĐÂY](https://polygon.codeforces.com/)
Sau đây là các bước để soạn bài bằng ==Polygon==.
### Bước 1: Tạo bài mới

### Bước 2: Thiết lập
#### General info (Thông tin cơ bản)

- Nhập xuất (`Input file` | `Output file`):
- Nhập từ bàn phím và in ra màn hình: stdin | stdout.
- Nhập từ file và in ra file: [TÊN FILE].INP | [TÊN FILE].OUT.
- Giới hạn thời gian (`Time limit`): Mặc định là 1000ms = 1s.
- Giới hạn bộ nhớ (`Memory limit`): Mặc định là 256MB.
>[!Note]
> Đối với các ==đề thi chính thức (HSG, Tuyển sinh, ...)== bắt buộc:
> - Nhập xuất bằng ==file==.
> - Giữ nguyên giới hạn ==thời gian== và ==bộ nhớ== của đề gốc.
#### Statement (Đề bài)

- Chọn ngôn ngữ: `English`.

- Nếu bài có subtask: Đánh dấu mục `Show section 'Scoring'`.
- Nếu đề bài có hình ảnh: Chọn `Add Files` và upload hình ảnh.

- Chọn chế độ: `Edit with preview` (Vừa chỉnh sửa vừa xem trước).

- `Name`: Tên bài.
- `Legend`: Đề bài chính.
- `Input`: Mô tả dữ liệu vào.
- `Output`: Mô tả dữ liệu ra.
- `Note`: Ghi chú (thường dùng để giải thích test ví dụ).
>[!Important] Quy tắc cần tuân thủ khi viết statement
> - Các quy tắc văn bản bình thường:
> - Viết hoa chữ cái đầu câu.
> - Cách một khoảng trắng sau mỗi dấu `.`, `,`, `;`, `:`, `?`.
> - Luôn sử dụng ==Math Mode== để viết tên biến, tên mảng và số.
> - Trong ==Math Mode== không được sử dụng ký tự trực tiếp từ bàn phím trừ tên riêng.
> VD: `(` thay bằng `\left(`, `<` thay bằng `\le`, ...
> - Tên biến viết chữ thường, tên mảng viết chữ hoa.
>[!Tip] Tài liệu tham khảo
> ==Statement== trên Polygon được viết bằng $\TeX$, trong đó tích hợp MathJax để biểu diễn các biểu thức toán học.
>
> - Hướng dẫn sử dụng [$\TeX$ và MathJax](https://polygon.codeforces.com/docs/statements-tex-manual?ccid=cf669c2b33013c836766e01e235ac188&session=a3fac5f8c2b0825acab46a391645bd88c0ffe710).
> - Tham khảo thêm về [MathJax](https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference).
#### Checker

==Checker== là chương trình để kiểm tra đáp án của thí sinh có ==hợp lệ== hay không.
- Trong hầu hết các bài, đáp án của thí sinh phải giống hệt đáp án của tác giả.
$\rightarrow$ Sử dụng checker `wcmp`: So khớp đáp án.
>[!Note]
>Đối với bài toán có dạng `In ra đáp án với độ chính xác 'x' chữ số phần thập phân` cũng sử dụng checker `wcmp`.
- Đối với những bài yêu cầu in ra `YES` hoặc `NO` mà các kí tự có thể in hoa hoặc không.
$\rightarrow$ Sử dụng checker `yesno` hoặc `nyesno`.
- Đối với những dạng khác, cần tự viết chương trình checker riêng.
#### Test

- Nếu bài có tính điểm theo test: Đánh dấu mục `Enable points`.
- Thêm test: `Add Test`.

- Điền ==input== của test vào ô `Data`, sau đó chọn `Create` để chuyển sang test tiếp theo.
- Tuy nhiên, trong những bài có nhiều test, làm như trên sẽ rất tốn thời gian. Vậy nên, hãy ưu tiên ==sinh test trên máy tính cá nhân== sau đó mới ==upload file test lên Polygon== bằng cách chọn mục `from the files`.
>[!Note]
> Dữ liệu của một test chỉ bao gồm ==input== và không có ==output==, vì ==output== sẽ được lấy từ ==code giải== mà mình upload lên Polygon (sẽ được hướng dẫn sau).

- `Delete`: Xóa test.
- `Copy`: Sao chép test.
- `Edit`: Chỉnh sửa nội dung test.
- `Move`: Thay đổi số thứ tự của test.
- `Points`: Thay đổi điểm của test.
- `Example`: Thay đổi việc có đặt test làm test ví dụ hay không.
- `Preview`: Kiểm tra output tương ứng với test.
>[!Note]
> - Nếu chỉ muốn chỉnh sửa thông tin của ==chỉ một== test, chọn các nút tương ứng với test đó (tương tự các nút được **khoanh màu xanh**).
> - Nếu muốn chỉnh sửa thông tin của ==nhiều== test, đánh dấu chọn vào ô của các test đó, sau đó chọn các nút được **khoanh màu đỏ**.
#### Solution (Code giải)

Chọn mục `Add Files`, sau đó tải file code giải của bài lên.
>[!Caution] Lưu ý
> Nếu bài nhập xuất từ file, code giải cũng phải cài đặt nhập xuất từ file (freopen).
#### Commit changes (Lưu thay đổi)

Kéo trang xuống dưới cùng, chọn `Commit changes`.

- Nếu cần ghi chú lại những thay đổi đã thực hiện, ghi vào mục `Commit message`.
- Nếu không muốn nhận email thông báo, đánh dấu mục `Minor changes`.
Sau đó chọn `Commit` để lưu thay đổi.
>[!Important]
> Trong trường hợp soạn bài chung với team, cần ==commit changes== thì những người còn lại mới có thể nhìn thấy sự thay đổi trong bài.
#### Packages (Đóng gói)

Để bài có thể hoạt động trên ==Codeforces==, cần "**đóng gói**" bài lại.
Ở trang `Packages` chọn `Standard`.
>[!Caution]
> - Chỉ tạo ==package== khi và chỉ khi đã hoàn thành xong tất cả các bước ở trên (đặc biệt là ==commit changes==).
> - Sau khi chỉnh sửa bất kỳ thứ gì trên bài (test, đề bài, code giải, ...), cần tạo một ==package== mới thì bài trên ==Codeforces== mới được cập nhật.
### Bước 3: Thêm bài vào contest trên Polygon
Cần thêm bài vào contest để phục vụ hai việc:
- Chỉnh sửa bài ==cùng nhau== giữa các thành viên trong team (Trong trường hợp này, cần phải thực hiện ==Bước 3== ngay sau ==Bước 1==).
- ==Team Leader== có thể tải bài lên Codeforces đồng loạt và tạo thành contest.
>[!Note]
> Contest trên ==Codeforces== **khác với** contest trên ==Polygon==.

Ở trang chủ của ==Polygon==, chọn `View Contests`.

Tại đây, sẽ hiện thông tin của các contest mà bạn ==có quyển chỉnh sửa== (nghĩa là đã được ==Team Leader== cấp quyền).
Chọn nút `Enter` tương ứng với contest mà bạn muốn thêm bài vào.

Tại trang vừa hiện lên, chọn `Add problems?`.

Đánh dấu những bài cần thêm ở cột `Add?`, sau đó chọn `Save`.

- Cấp quyền cho `codeforces` là `READ`.
- Cấp quyền cho mọi tài khoản còn lại là `WRITE`.
Hướng dẫn sử dụng HackMD để soạn lời giải
---
### Đăng ký tài khoản
[ĐĂNG KÝ TẠI ĐÂY](https://hackmd.io/)
Sau đây là các bước để soạn lời giải bằng ==HackMD==.
### Bước 1: Tạo lời giải mới

Chọn tài khoản ==The Algitect== để cùng chỉnh sửa lời giải với các thành viên khác trong team.
Chọn `Create team note` để tạo lời giải mới.
### Bước 2: Viết lời giải
Trong quá trình viết ==lời giải== trên **HackMD** cần sử dụng ==Markdown==.
> *Vào `My Workspace`, chọn `Learning Markdown` để xem hướng dẫn.*

- Bên tay phải là màn hình ==chỉnh sửa==, viết bằng ==Markdown==.
- Bên tay phải là màn hình ==hiển thị==, cho phép xem trước chính xác lời giải sẽ hiển thị như thế nào trên máy tính khác.
>[!Important] Quy tắc cần tuân thủ khi viết lời giải
> - Tất cả các [quy tắc khi viết statement](https://hackmd.io/@algitect/logica_tutorial?stext=2797%3A449%3A0%3A1738519969%3AaEFJPT).
> - Đối với ==code mẫu==, cần tuân thủ các quy tắc sau:
> - Tuyệt đối không dùng lệnh `define`.
> - Cần viết ==cách ra==.
> - Luôn luôn ==mở ngoặc và xuống dòng== đối với các lệnh `if`, `for`, `while`, ...
> - Đặt ==tên hàm== đầy đủ, đúng mục đích của hàm.
> - Không viết ==freopen==, ==ios_base==.
> - Cố gắng ==comment== rõ ràng ở những vị trí code khó hiểu.
> - Code mẫu phải tuân theo ==lời giải==.
>[!Tip] Lời giải mẫu:
> [**LỜI GIẢI TẠI ĐÂY**](https://hackmd.io/@algitect/hsg9brvt2016)