Tất cả lộ trình luyện tập
-
1Đã tham gia
Minimax và Tìm kiếm đối kháng (Adversarial Search)
Lộ trình chuyên sâu về Minimax và Tìm kiếm đối kháng (Adversarial Search), bắt đầu từ mô hình hóa trò chơi, cây trạng thái, đệ quy, Minimax, Negamax và Alpha–Beta Pruning; sau đó mở rộng đến các kỹ thuật được sử dụng trong game engine hiện đại như Move Ordering, Iterative Deepening, Transposition Table, Zobrist Hashing, Quiescence Search, PVS, Aspiration Window, Null Move Pruning và LMR. Xuyên suốt lộ trình, học viên từng bước vận dụng kiến thức để xây dựng một Chess Engine hoàn chỉnh.
- 2 phần, 4 bài tập
-
8Đã tham gia
Các Bài Toán Nhập Môn
Các Bài Toán Nhập Môn là bước khởi đầu trong hành trình học Competitive Programming, giúp xây dựng nền tảng tư duy thuật toán và kỹ năng lập trình cơ bản. Lộ trình tập trung vào việc phân tích đề bài, tìm quy luật, thiết kế thuật toán và triển khai lời giải hiệu quả thông qua các kỹ thuật như mô phỏng, toán học, tham lam, tìm kiếm toàn bộ, đệ quy, quay lui và xử lý bit.
- 1 phần, 16 bài tập
-
1Đã tham gia
Lộ trình Sàng số nguyên tố
Lộ trình Sàng số nguyên tố giúp học viên nắm vững cách tìm và xử lý số nguyên tố hiệu quả trong lập trình thi đấu. Bắt đầu từ kiểm tra nguyên tố cơ bản, học viên sẽ lần lượt làm chủ Sàng Eratosthenes, sàng tối ưu, mảng ước nguyên tố nhỏ nhất, Sàng tuyến tính và các ứng dụng quan trọng trong phân tích thừa số, đếm số nguyên tố và xử lý truy vấn.
- 1 phần, 3 bài tập
-
3Đã tham gia
Lộ trình Đường đi ngắn nhất
Lộ trình luyện tập toàn diện các bài toán đường đi ngắn nhất trong Competitive Programming, từ BFS, 0-1 BFS đến Dijkstra, Bellman–Ford, Floyd–Warshall và Johnson; chú trọng nhận dạng mô hình, lựa chọn đúng thuật toán và xử lý các biến thể nâng cao.
- 2 phần, 5 bài tập
-
2Đã tham gia
Dijkstra từ cơ bản đến nâng cao
Lộ trình chuyên sâu về thuật toán Dijkstra, được tổ chức từ mô hình đường đi ngắn nhất cơ bản đến các biến thể thường gặp trong Competitive Programming. Trọng tâm không chỉ là cài đặt thuật toán, mà là hình thành khả năng nhận diện mô hình, xây dựng trạng thái, biến đổi bài toán về đồ thị và lựa chọn đúng phiên bản Dijkstra cho từng cấu trúc bài toán.
- 12 phần, 18 bài tập
-
1Đã tham gia
Greedy
Thuật toán tham lam (Greedy) là một trong những chủ đề quan trọng nhất để hình thành tư duy lựa chọn trong Competitive Programming, bởi một lời giải Greedy tốt không đến từ việc thấy dữ liệu rồi “sort và lấy lớn nhất”, mà từ khả năng nhận ra một lựa chọn cục bộ có thể được thực hiện ngay mà vẫn bảo toàn một nghiệm tối ưu cho phần còn lại. Khi học chắc chủ đề này, học sinh sẽ dần nhận ra nhiều mẫu tư duy xuất hiện lặp lại như dominance, exchange argument, stays-ahead, chọn cực trị bằng hai con trỏ, earliest finish trong interval scheduling, farthest reach trong interval covering, replace-worst và retroactive greedy với Heap, constructive greedy giữ invariant, tối ưu thứ tự từ điển bằng monotonic deletion, các bài phân bổ tài nguyên theo coverage invariant, cho tới những ứng dụng sâu hơn trong Kruskal, Dijkstra và hàm kiểm tra của Binary Search Answer. Giá trị lớn nhất của Greedy không phải là thuộc nhiều mẹo, mà là rèn được thói quen luôn tự hỏi vì sao quyết định hiện tại là an toàn, có thể đổi một nghiệm tối ưu để chứa quyết định đó hay không, và nếu không chứng minh được thì phải biết dừng đúng lúc để chuyển sang DP, shortest path, matching hoặc một mô hình phù hợp hơn.
- 1 phần, 20 bài tập
-
1Đã tham gia
Quy hoạch động
Quy hoạch động là một trong những kỹ năng quan trọng nhất của Competitive Programming vì nó buộc người học phải nhìn xuyên qua câu chuyện của đề để xác định “thông tin tối thiểu của quá khứ cần giữ lại cho tương lai”. Khi đã nắm chắc DP, học sinh không chỉ biết các mẫu quen thuộc như Knapsack, LIS, LCS hay Tree DP, mà còn có thể tự thiết kế state cho những bài chưa từng gặp, nhận ra khi recurrence đang quá chậm và tiếp tục biến đổi nó bằng prefix sum, monotone queue, Fenwick/Segment Tree, CHT, Divide & Conquer Optimization, Knuth, matrix exponentiation hoặc các kỹ thuật subset nâng cao. Mục tiêu cuối cùng của chuyên đề không phải thuộc hàng chục template, mà là hình thành phản xạ từ brute force → state → transition → tối ưu, để có thể tự xây dựng lời giải cho những bài DP mới trong thi đấu.
- 2 phần, 39 bài tập
-
1Đã tham gia
Segment Tree
Segment Tree là một trong những cấu trúc dữ liệu quan trọng nhất khi bước từ các bài truy vấn mảng cơ bản sang những bài lập trình thi đấu thực sự đòi hỏi thiết kế trạng thái. Điều đáng học ở Segment Tree không nằm ở việc ghi nhớ một template cố định, mà ở khả năng nhìn một đoạn dữ liệu và xác định được Node cần lưu gì, hai đoạn phải gộp ra sao, cập nhật tác động thế nào và thông tin nào đủ mạnh để loại bỏ cả một nhánh của cây. Từ nền tảng range query và point update, tư duy này phát triển tự nhiên tới custom Node, tìm vị trí trực tiếp bằng tree walking, lazy propagation, hợp thành các phép biến đổi, Segment Tree Beats, Merge Sort Tree, Persistent Segment Tree, Euler Tour, Heavy-Light Decomposition, cây trên miền tọa độ lớn, Segment Tree trên trục thời gian và các bài kết hợp với DP, đồ thị hay sweep line. Khi học đến cuối lộ trình, mục tiêu không còn là “biết dùng Segment Tree”, mà là nhận ra chính xác lúc nào nó là cấu trúc phù hợp, lúc nào Fenwick Tree, prefix sum, Sparse Table hay một kỹ thuật khác đơn giản hơn, từ đó hình thành phản xạ lựa chọn và thiết kế cấu trúc dữ liệu thay vì chỉ áp dụng công thức có sẵn.
- 8 phần, 88 bài tập
-
3Đã tham gia
Binary Search
Binary Search là một trong những kỹ thuật quan trọng nhất để chuyển từ tư duy “thử từng đáp án” sang tư duy “tìm ranh giới”, và khi đã hiểu đúng bản chất này, học sinh sẽ thấy nó xuất hiện ở nhiều nơi hơn rất nhiều so với việc tìm một số trong mảng đã sắp xếp. Từ lower_bound và upper_bound, kỹ thuật dần mở rộng sang tìm phần tử k-th trên miền giá trị, LIS, Binary Search the Answer, tối ưu hóa min-max và max-min, rồi kết hợp với greedy, scheduling, graph, Dijkstra, DSU, matching, max flow, DP và Parallel Binary Search. Điều quan trọng nhất không phải thuộc một đoạn code, mà là biết biến bài toán tối ưu thành một bài toán quyết định can(x), chứng minh điều kiện đó đơn điệu, xác định chính xác cần first true hay last true, chọn cận đủ chặt, kiểm soát overflow và sai số, rồi đánh giá toàn bộ chi phí của oracle trước khi quyết định Binary Search có thật sự là công cụ phù hợp hay không.
- 2 phần, 50 bài tập
-
1Đã tham gia
Cây tìm kiếm nhị phân (Binary Search Tree - BST)
Cây tìm kiếm nhị phân (Binary Search Tree - BST) là một chủ đề đặc biệt quan trọng vì nó giúp học sinh chuyển từ cách nghĩ “duyệt hết dữ liệu” sang cách khai thác trật tự để loại bỏ những phần chắc chắn không cần xét. Khi hiểu thật chắc bất biến của BST, học sinh không chỉ biết tìm kiếm, chèn hay xóa nút mà còn hiểu vì sao inorder tạo ra thứ tự tăng, vì sao predecessor và successor có thể tìm mà không cần quét toàn bộ dữ liệu, vì sao một cây bị suy biến có thể làm thuật toán từ nhanh trở thành chậm, và khi nào nên dùng set, multiset, map thay cho việc tự dựng cây. Từ nền tảng đó, BST mở rộng rất tự nhiên sang các kỹ thuật mạnh hơn như tăng cường cây bằng kích thước cây con để xử lý rank/select, cây cân bằng (Balanced BST), Treap với split và merge, implicit Treap cho dãy động và lazy propagation cho thao tác đoạn. Quan trọng hơn, ở các bài khó BST đôi khi không còn là một cấu trúc phải cài trực tiếp mà trở thành một tính chất thứ tự: ta có thể biến cây thành dãy inorder, biến cây con thành một đoạn liên tiếp, rồi kết hợp với hai con trỏ, tổ hợp, quy hoạch động đoạn hoặc các kỹ thuật khác. Nắm được cách nhìn này giúp học sinh nhận ra bản chất bài toán trước khi chọn cấu trúc dữ liệu, thay vì thấy chữ “cây” là lập tức viết một BST.
- 1 phần, 24 bài tập