ACMICPC Preparation
This curriculum has been developed to learn Algorithms to use in Competitive Programming, but can also be used for:
 Practicing for Interviews
 Improving Algorithmic Thinking
 Practicing for College Classes
Prerequisites:
 To know at least one programming language. (You have to be able to use the language efficiently.)
The concept of this repository is to have wellstructured content divided into parts that one can follow even if they are busy. Here we collected sources we find well prepared to learn the proposed topics. The curriculum has different data structures and algorithms.
Estimated time required for a week is 67 hours. (To complete the curriculum in the given time)
Basic usage guide:
Using this repository depends on what the user wants to do with it. Here we are suggesting the following for people who want to slowly gain knowledge of the topics while continuing their studies etc.:
 Check out the written or video sources provided for a given topic depending on the preference. Go over as many as needed to gain a good understanding of the topic.
 Without checking the source code, try to replicate the algorithm or data structure on your own.
 When stuck or when done, look at the source codes provided, and compare them with yours to see what might be your mistake. Try to fix it.
 After you feel comfortable with the code, try to solve the given problems.
 When you are done with solving or are stuck at some point, check given solutions and try to understand your mistake or see if a better approach exists.
Resources
Here are some of the websites/tools that we use through this curriculum:
Contribution
If you have anything to add, do not hesitate to offer! You can check Code of Conduct. You can submit a PR or an issue; I will try to personally review all.
Topics
Here are the topics we currently include in the curriculum.
Data Structures
 Stacks
 Queues
 Priority queue
 Hashmap
 Linked List
 Trees
 Heaps
 Advanced Trees
 Tries
 Segment trees
 Fenwick tree or Binary indexed trees
 RMQ
 SQRT Decomposition
 Disjoint Data Structure
 C++ STL (optional)
Algorithms
Curriculum
Week 
Topics 
Optional Topics 
**Heads Up ** 


1.Week 
 Prime Numbers (Sieve of Eratosthenes)
 Efficient Prime Factorization
 Modular Exponentiation


2.Week 
 GCD and LCM Euclid’s Algorithm
 Long arithmetic (Multi, Sum, Div, Sub)

 C++ STL:Vector
 C++ STL:Pairs
 C++ STL:Iterators

3.Week 

 C++ STL:String
 C++ STL:Set
 C++ STL:Map

4.Week 


5.Week 
 Queue (DS)
 Stack (DS)
 Breadth First Search
 Depth First Search

 C++ STL: Queue
 C++ STL: Stack

6.Week 
 Linked List (DS)
 Dijkstra’s Shortest Path
 Minimum Spanning Tree (MST)
 Floyd Warshall

 Cycle Detection (Union Find)

7.Week 
 Knapsack
 Coin Change
 Kadane


8.Week 
Questions from previous topics 

9.Week 
 Trees (DS)
 Segment Trees (DS)
 Range Minimum Query (RMQ)
 Lowest Common Ancestor (LCA)


10.Week 
 Ford Bellman
 Max Flow / Min Cut
 Longest increasing Subsequence (with RMQ)

 Heavy Light Decomposition

11.Week 
 Primitive Operations
 Intuition
 Polygon Inside, Outside
 Implementing CCW
 Immutable Point ADT
 Convex Hull
 Closest pair problem
 Line intersection


12.Week 
 Tries (DS)
 Suffix Trees/Arrays (DS)
 KnuthMorrisPratt Algorithm (KMP)
 RabinKarp Algorithm


13.Week 
 Heaps (DS)
 Priority queue (DS)
 Combinatorics


14.Week 
 Z algorithm
 Hash
 Disjoint Data Structure (DS)


15.Week 
 Matrix chain multiplication
 SQRT Decomposition (DS)

 Mo's Algorithm
 Rod Cutting

16.Week 
Questions from previous topics 

17.Week 


18.Week 
 SpragueGrundy theorem
 Fenwick tree or Binary indexed trees (DS)


19.Week 

 Palindromic Tree
 AVL Trees

20.Week 
 Heavy Light Decomposition
 Dynamic Programming by Profile

