Chương 2: C++ cho Thi Đấu — Từ Zero đến Hero¶
Dành cho: Người đã biết Python cơ bản (hoặc ngôn ngữ bất kỳ)
Mục tiêu: Viết được code C++, sử dụng STL, thi đấu competitive programming hiệu quả
Tại sao học C++?¶
Nếu Python là xe đạp (dễ lái, chậm) thì C++ là xe máy (khó hơn một chút, nhưng nhanh gấp 100 lần).
flowchart LR
A["Python<br>De hoc, cham"] -->|"Chuyen doi"| B["C++<br>Nhanh, manh"]
B --> C["Thi dau<br>Hieu qua"]
| Tiêu chí | Python | C++ |
|---|---|---|
| Tốc độ | ~10⁶ phép tính/giây | ~10⁸ phép tính/giây |
| Cú pháp | Đơn giản | Phức tạp hơn một chút |
| Compile | Chạy trực tiếp | Phải compile trước |
| Thư viện | Nhiều built-in | STL rất mạnh |
| Đệ quy | Giới hạn ~1000 lớp | Giới hạn lớn hơn nhiều |
Khi nào dùng Python, khi nào dùng C++?
- Dùng Python khi: Học thuật toán mới, viết nhanh prototype, bài không yêu cầu tốc độ
- Dùng C++ khi: Thi đấu chính thức, bài yêu cầu tốc độ, cần STL nâng cao
Lộ trình học C++ cho người mới¶
Học theo thứ tự từ trên xuống
Mỗi nhóm xây dựng trên kiến thức nhóm trước. Đừng nhảy cóc!
flowchart TD
subgraph G1["Nhom 1 - Bat dau (Tuan 1-2)"]
C01["C01: Cai dat & Hello World"]
C02["C02: Bien, Kieu du lieu, Nhap/Xuat"]
C03["C03: Dieu kien & Vong lap"]
end
subgraph G2["Nhom 2 - Xu ly du lieu (Tuan 3-4)"]
C04["C04: Mang & Vector"]
C05["C05: String (Xau ky tu)"]
end
subgraph G3["Nhom 3 - To chuc code (Tuan 5)"]
C06["C06: Ham trong C++"]
C07["C07: Template & Fast I/O"]
end
subgraph G4["Nhom 4 - STL co ban (Tuan 6-7)"]
C09["C09: Pair & Tuple"]
C11["C11: Sort & Algorithm"]
C13["C13: Queue, Stack, Deque"]
end
subgraph G5["Nhom 5 - STL nang cao (Tuan 8-9)"]
C10["C10: Vector nang cao"]
C12["C12: Set & Map"]
C14["C14: Algorithm nang cao"]
end
subgraph G6["Nhom 6 - Thi dau (Tuan 10)"]
C15["C15: Meo thi dau C++"]
C08["C08: Reference & Pointer"]
end
subgraph G7["Nhom 7 - Nang cao (Tuan 11+)"]
C16["C16: Bai tap tong hop"]
C17["C17: STL & So hoc"]
C18["C18: Xu ly xau nang cao"]
C19["C19: Matrix & Grid"]
C20["C20: Lambda & Iterator"]
C21["C21: Tham chieu nhanh"]
C22["C22: Struct & Operator Overloading"]
end
G1 --> G2 --> G3 --> G4 --> G5 --> G6 --> G7
Danh sách bài học chi tiết¶
Nhóm 1 — Bắt đầu (Tuần 1-2)¶
Mục tiêu: Viết được chương trình C++ đơn giản, hiểu cú pháp cơ bản
| # | Bài học | Bạn sẽ học được | So sánh Python |
|---|---|---|---|
| C01 | Cài đặt & Hello World | Cài compiler, IDE, chương trình đầu tiên | print("Hello") → cout << "Hello" |
| C02 | Biến & Kiểu dữ liệu | Khai báo biến, nhập/xuất, toán tử | x = 10 → int x = 10; |
| C03 | Điều kiện & Vòng lặp | if/else, for, while | for i in range(n) → for(int i=0;i<n;i++) |
Nhóm 2 — Xử lý dữ liệu (Tuần 3-4)¶
Mục tiêu: Làm việc được với mảng và chuỗi — 2 kiểu dữ liệu phổ biến nhất
| # | Bài học | Bạn sẽ học được | So sánh Python |
|---|---|---|---|
| C04 | Mảng & Vector | Mảng tĩnh, vector, duyệt, thao tác | a = [0]*n → vector<int> a(n) |
| C05 | String | Chuỗi C++, các phương thức | s = "hello" → string s = "hello"; |
Nhóm 3 — Tổ chức code (Tuần 5)¶
Mục tiêu: Viết code sạch, tái sử dụng được, chạy nhanh
| # | Bài học | Bạn sẽ học được | So sánh Python |
|---|---|---|---|
| C06 | Hàm trong C++ | Định nghĩa hàm, overload, template | def f(x): → int f(int x) |
| C07 | Template & Fast I/O | Template thi đấu, tối ưu I/O | Tăng tốc nhập/xuất gấp 10 lần |
Nhóm 4 — STL cơ bản (Tuần 6-7)¶
Mục tiêu: Sử dụng được các cấu trúc dữ liệu cơ bản trong thi đấu
| # | Bài học | Bạn sẽ học được | So sánh Python |
|---|---|---|---|
| C09 | Pair & Tuple | Gom nhóm 2-3 giá trị | Tuple Python |
| C11 | Sort & Algorithm | Sắp xếp, reverse, unique | sorted() Python |
| C13 | Queue, Stack, Deque | Hàng đợi, ngăn xếp, deque | deque, heapq Python |
Nhóm 5 — STL nâng cao (Tuần 8-9)¶
Mục tiêu: Sử dụng thành thạo các cấu trúc dữ liệu mạnh mẽ
| # | Bài học | Bạn sẽ học được | So sánh Python |
|---|---|---|---|
| C10 | Vector nâng cao | Iterator, resize, 2D vector | List nâng cao |
| C12 | Set & Map | set, multiset, map, unordered_* | Dict/Set Python |
| C14 | Algorithm nâng cao | lower_bound, upper_bound, next_permutation | bisect, itertools |
Nhóm 6 — Thi đấu (Tuần 10)¶
Mục tiêu: Sẵn sàng thi đấu, biết các trick quan trọng
| # | Bài học | Bạn sẽ học được |
|---|---|---|
| C15 | Mẹo thi đấu C++ | Macro, template, cheat sheet, trick hay |
| C08 | Reference & Pointer | Tham chiếu, con trỏ (nâng cao hơn) |
Nhóm 7 — Nâng cao (Tuần 11+)¶
Mục tiêu: Nắm vững các kỹ thuật nâng cao cho bài khó
| # | Bài học | Bạn sẽ học được |
|---|---|---|
| C16 | Bài tập tổng hợp | 18 bài tập + 20 bài CSES |
| C17 | STL & Số học | numeric, bitmask, modular, sieve |
| C18 | Xử lý xâu nâng cao | stringstream, getline, pattern |
| C19 | Matrix & Grid | BFS/DFS lưới, prefix sum 2D |
| C20 | Lambda & Iterator | Lambda, iterator, erase-remove |
| C21 | Tham chiếu nhanh | memset, memcpy, bitset, tips |
| C22 | Struct & Operator Overloading | Struct, custom comparator |
So sánh nhanh Python vs C++¶
Hello World¶
Đọc 2 số và in tổng¶
Duyệt mảng¶
Câu hỏi thường gặp¶
C++ khó hơn Python nhiều không?
Không nhiều! Nếu bạn đã biết Python, bạn chỉ cần học cách khai báo kiểu dữ liệu và một số cú pháp khác. Logic giải thuật vẫn giống nhau.
Mất bao lâu để học C++?
Nếu bạn đã biết Python, chỉ cần 2-3 tuần là có thể viết C++ cơ bản. Sau 1-2 tháng là có thể thi đấu.
Có cần học hết C++ không?
Không! Trong thi đấu, bạn chỉ cần biết khoảng 30% C++ — phần còn lại là thư viện STL. Bài học này tập trung vào phần đó.
Nên dùng IDE nào?
Code::Blocks hoặc Dev-C++ — cả hai đều miễn phí, đã có sẵn compiler, và được phép dùng trong thi đấu.
Bài tập luyện tập¶
- CSES Problem Set — Bộ bài tập cơ bản
- VNOJ — OJ Việt Nam
- Codeforces — Contest online