Tuyển sinh 🎓 Mình nhận đào tạo lập trình giải thuật thi đấu: thi vào lớp 10 chuyên tin · thi học sinh giỏi tin học cấp tỉnh/thành · thi vào đội tuyển quốc gia · Olympic tin học sinh viên / ICPC · phỏng vấn thuật toán. Bấm vào đây để xem thông tin khóa học → Xem khóa học

Lộ trình học thuật toán từ A đến Z

Lộ trình học thuật toán từ A đến Z
// roadmap: zero → hero
Lộ trình học thuật toán từ A đến Z

Bạn mới bắt đầu và không biết nên đọc bài nào trước? Mình đã sắp xếp toàn bộ lời giải trên web thành 9 chặng từ dễ đến khó, đúng theo thứ tự mình vẫn dạy học viên ôn thi vào lớp 10 chuyên Tin, thi HSG cấp tỉnh và đội tuyển. Mỗi bài có ý tưởng, code C++/Python và khung chấm thử ngay dưới bài.

Cách dùng lộ trình này

1Tự làm trước

Đọc đề, tự nghĩ và tự code ít nhất 20–30 phút rồi mới xem lời giải. Bí quá thì chỉ đọc phần ý tưởng thôi.

2Chấm thử ngay dưới bài

Dán code vào khung Chấm thử ở cuối mỗi bài để chạy với test ví dụ. Học viên của lớp thì nộp lên CLUE OJ để chấm với bộ test đầy đủ.

3Đánh dấu đã giải

Bấm vào ô tròn trước mỗi bài, hoặc nút Đánh dấu đã giải trong bài, để theo dõi tiến độ. Trang chủ cũng hiện tiến độ của bạn.

Chặng 1. Nhập môn & kỹ năng cơ bản

🧱

Đây là phần móng. Bạn tập đọc đề cho kỹ, nhập xuất dữ liệu nhanh, duyệt mảng, vét cạn có kiểm soát và luôn tự hỏi: code mình chạy bao nhiêu phép tính? Phần lớn lỗi sai của học sinh mới đến từ tràn số (quên long long) và vòng lặp chạy quá lâu.

  • Ước lượng độ phức tạp trước khi code: khoảng 108 phép tính mỗi giây.
  • Thấy số lớn hơn 2·109 thì dùng ngay long long.
  • Viết vét cạn trước, rồi mới tối ưu.

Chặng 2. Toán & số học

🔢

Đề thi HSG rất hay có bài toán học: chia hết, ước, số nguyên tố, đồng dư, tìm quy luật. Chỉ cần nhận xét đúng là code rất ngắn, nhưng nếu không nhìn ra thì có code dài cũng không qua được.

  • Thuộc lòng sàng Eratosthenes và cách đếm ước.
  • Kết quả lớn thì lấy modulo ở mọi bước cộng và nhân.
  • Thử tay với N nhỏ để tìm quy luật, sau đó mới chứng minh.

Chặng 3. Xử lý chuỗi

🔤

Xâu ký tự xuất hiện trong gần như mọi đề thi: đếm ký tự, xâu con, đối xứng, so khớp. Bạn nắm chắc thao tác cơ bản trước rồi mới học KMP và Hash.

  • Dùng mảng đếm 26 chữ cái thay cho map khi có thể.
  • Để ý chỉ số bắt đầu từ 0 hay 1, sai một vị trí là WA.
  • Đọc cả dòng có dấu cách thì dùng getline.

Chặng 4. Sắp xếp, mảng cộng dồn, hai con trỏ

📊

Đây là nhóm kỹ thuật "rẻ mà mạnh": sắp xếp, mảng cộng dồn (prefix sum), mảng hiệu, hai con trỏ, rời rạc hoá. Nhiều bài O(N²) xuống được O(N) hoặc O(N log N) chỉ nhờ một mảng cộng dồn.

  • Gặp câu hỏi tổng đoạn [l, r] thì nghĩ ngay tới prefix sum.
  • Có nhiều lần cộng vào một đoạn thì dùng mảng hiệu.
  • Mảng đã sắp xếp mà cần tìm cặp thì thử hai con trỏ.

Chặng 5. Tham lam & tìm kiếm nhị phân

🎯

Tham lam là chọn cái tốt nhất ở mỗi bước. Khó nhất là chứng minh cách chọn đó đúng. Tìm kiếm nhị phân không chỉ để tìm phần tử trong mảng, mà còn để chặt nhị phân đáp án, một kỹ thuật cực kỳ hay gặp.

  • Nghĩ ra cách tham lam thì thử tìm phản ví dụ trước khi code.
  • Đề hỏi "nhỏ nhất sao cho…" hay "lớn nhất sao cho…" thì nghĩ tới chặt nhị phân đáp án.
  • Viết hàm check(x) riêng cho gọn và dễ sửa.

Chặng 6. Đệ quy, quay lui, chia để trị

🌳

Đệ quy là nền tảng cho quay lui, chia để trị, duyệt bitmask và meet in the middle. Đây cũng là cầu nối để bước sang quy hoạch động.

  • Luôn viết điều kiện dừng trước.
  • Quay lui thì nhớ cắt nhánh sớm để chạy kịp thời gian.
  • N ≤ 20 thì nghĩ tới bitmask, N ≤ 40 thì nghĩ tới meet in the middle.

Chặng 7. Quy hoạch động

🧩

Quy hoạch động là "trùm cuối" của các kỳ thi HSG và chuyên Tin. Bạn cần trả lời được 3 câu: trạng thái là gì, chuyển trạng thái thế nào, và cơ sở (trường hợp nhỏ nhất) là gì.

  • Bắt đầu từ các bài kinh điển: cái túi, dãy con tăng, đếm cách.
  • Viết công thức truy hồi ra giấy trước khi code.
  • Gặp đếm số trong đoạn [A, B] theo chữ số thì dùng Digit DP.

Chặng 8. Đồ thị

🕸️

Phần dành cho mục tiêu đội tuyển và chuyên Tin cấp cao: duyệt đồ thị BFS/DFS, đường đi ngắn nhất, cây khung, DSU, cây và LCA. Rất nhiều bài nhìn qua tưởng không liên quan, nhưng khi mô hình hoá thành đồ thị là ra ngay.

  • Lưu đồ thị bằng danh sách kề (vector<int> adj[N]).
  • Đồ thị không trọng số thì BFS, có trọng số không âm thì Dijkstra.
  • Cần gộp nhóm hoặc kiểm tra liên thông nhanh thì dùng DSU.

Chặng 9. Cấu trúc dữ liệu & kỹ thuật nâng cao

🏗️

Các cấu trúc dữ liệu giúp code nhanh hơn hẳn: ngăn xếp, hàng đợi, hàng đợi ưu tiên, set/map, ngăn xếp đơn điệu, rồi tới Segment Tree, Fenwick Tree, Sparse Table. Đây là những "vũ khí" để lấy trọn điểm các bài khó nhất.

  • Tìm phần tử gần nhất lớn hơn hoặc nhỏ hơn thì dùng ngăn xếp đơn điệu.
  • Truy vấn đoạn có cập nhật thì dùng Segment Tree hoặc Fenwick.
  • Luôn ghi nhớ độ phức tạp của từng thao tác trên set/map/priority_queue.

Bài tổng hợp và luyện thêm

🏁

Những bài kết hợp nhiều kỹ thuật, hoặc chưa xếp vào chặng nào ở trên. Bạn dùng phần này để luyện phản xạ như khi đi thi thật.

Các bài của chặng này đang được mình soạn, bạn quay lại sau nhé.

Học nhanh hơn với người kèm

Tự học theo lộ trình này là hoàn toàn được. Nhưng nếu bạn cần người chữa bài, chỉ ra lỗi sai và lên kế hoạch ôn thi sát với đề của tỉnh mình, mình luôn sẵn sàng đồng hành.

Nếu thấy lộ trình hữu ích, bạn để lại một lời bình luận hoặc chia sẻ cho bạn bè cùng học nhé. Đó là động lực rất lớn để mình viết thêm nhiều bài nữa! 💪

Nhận xét