If you are a beginner, you can either follow our weekly training or "Part 1, USACO Training Program" below. Our training sessions are organized online as Vjudge virtual contests, which you can participate in whenever and wherever you like.
For non-beginners, there are some lecture notes for your reference at the bottom of this page.
To start your programming contest life, the most basic thing is learning to code, then data structure.
This week, you are suggested to learn some basic data structures: Union-find Set, Heap, Fenwick Tree.
Following are some materials you may find useful:
Union-find Set:
https://www.geeksforgeeks.org/union-find/
https://www.geeksforgeeks.org/union-find-algorithm-set-2-union-by-rank/
Heap:
https://www.hackerearth.com/practice/data-structures/trees/heapspriority-queues/tutorial/
Fenwick Tree:
https://en.wikipedia.org/wiki/Fenwick_tree
https://www.geeksforgeeks.org/binary-indexed-tree-or-fenwick-tree-2/
You are also encouraged to search for more learning resources through Google.
Problem set:https://vjudge.net/contest/394235
The password of the problemset is "hkuacm".
In this week, you are suggested to learn two powerful data structures that focus on solving "update and query" problems: Segment Tree and Self-balancing Binary Search Tree. Before heading into that, you are also recommended to have a basic idea about divide-and-conquer strategy in algorithm design.
Following are some materials you may find useful:
Divide-and-conquer:
https://en.wikipedia.org/wiki/Divide-and-conquer_algorithm
https://www.geeksforgeeks.org/divide-and-conquer-algorithm-introduction/
Segment Tree:
https://en.wikipedia.org/wiki/Segment_tree
https://cp-algorithms.com/data_structures/segment_tree.html
Self-balancing Binary Search Tree:
https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
https://en.wikipedia.org/wiki/Splay_tree
https://codeforces.com/blog/entry/79524
https://cp-algorithms.com/data_structures/treap.html
You are also encouraged to search for more learning resources through Google.
Problem set:https://vjudge.net/contest/395538
The password of the problemset is "hkuacm".
In this week, you are suggested to start to learn about some basic graph algorithms.
Following are some materials you may find useful:
Graph:
https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)
https://www.geeksforgeeks.org/graph-and-its-representations/
Depth-first search/Breadth-first search:
https://en.wikipedia.org/wiki/Depth-first_search
https://en.wikipedia.org/wiki/Breadth-first_search
Topological sorting:
https://en.wikipedia.org/wiki/Topological_sorting
https://www.geeksforgeeks.org/topological-sorting/
Tree:
https://en.wikipedia.org/wiki/Tree_(graph_theory)
Minimum spanning tree:
https://en.wikipedia.org/wiki/Minimum_spanning_tree
https://cp-algorithms.com/graph/mst_prim.html
https://cp-algorithms.com/graph/mst_kruskal.html
https://cp-algorithms.com/graph/mst_kruskal_with_dsu.html
Lowest common ancestor:
https://en.wikipedia.org/wiki/Lowest_common_ancestor
https://cp-algorithms.com/graph/lca.html
https://cp-algorithms.com/graph/lca_binary_lifting.html
https://cp-algorithms.com/graph/lca_farachcoltonbender.html
https://cp-algorithms.com/graph/rmq_linear.html
https://cp-algorithms.com/graph/lca_tarjan.html
You are also encouraged to search for more learning resources through Google.
Problem set:https://vjudge.net/contest/397412
The password of the problemset is "hkuacm".
Before heading into more algorithms, this week, you are suggested to learn a very powerful algorithmic design technique: dynamic programming.
Rather than hardcore contents like data structures and well-structured algorithms, dynamic programming always requires fewer coding, but more thinking.
In dynamic programming, there are two key properties: optimal substructure property and overlapping subproblems property. Although we could not design a dynamic programming algorithm by simply following these properties, they can, and always, help us reject some incorrect random ideas. You are suggested to have a look at these properties, have an initial feeling about that, and figure out them in following classic problems.
Following are some materials you may find useful:
Some concepts:
https://www.geeksforgeeks.org/solve-dynamic-programming-problem/
Knapsack problems:
https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/
https://www.geeksforgeeks.org/printing-items-01-knapsack/
https://www.geeksforgeeks.org/unbounded-knapsack-repetition-items-allowed/
Subset sum problem:
https://www.geeksforgeeks.org/subset-sum-problem-dp-25/
Longest increasing subsequence problem:
https://www.geeksforgeeks.org/longest-increasing-subsequence-dp-3/
Longest common subsequence problem:
https://www.geeksforgeeks.org/longest-common-subsequence-dp-4/
Maximum size square sub-matrix with all 1s:
https://www.geeksforgeeks.org/maximum-size-sub-matrix-with-all-1s-in-a-binary-matrix/
Dynamic programming on intervals:
http://www.cs.ust.hk/mjg_lib/Classes/COMP3711H_Fall16/lectures/19_DPII.pdf
You are also encouraged to search for more learning resources through Google.
Problem set:https://vjudge.net/contest/398892
The password of the problemset is "hkuacm".
Talking about programming, we can not leave the algorithm alone. And talking about algorithms, mathematics is always important. Number theory is one of the major parts of programming contests, but knowing only concepts or writing a proof is not enough for a programming contest. In this part, you will learn how to solve some basic number theory problems by computer using programming.
Following are some materials you may find useful:
https://artofproblemsolving.com/community/c90633h1291397
https://www.geeksforgeeks.org/number-theory-competitive-programming/
You are also encouraged to search for more learning resources through Google.
Problem set:https://vjudge.net/contest/402410
The password of the problemset is "hkuacm".