• Stars
    star
    215
  • Rank 183,925 (Top 4 %)
  • Language
    C++
  • Created about 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Page of the course "Competitive Programming and Contests" at Department of Computer Science, University of Pisa

Competitive Programming and Contests

  • Teacher: Rossano Venturini
  • CFU: 6
  • Period: First semester
  • Language: English
  • Classroom: here. Code is d77kira
  • Lectures schedule: Monday 9-11 Room C1 and Thursday 9-11 Room C1 -- (Google Meet, link on our classroom)
  • Question time: After lectures or by appointment

Goals and opportunities

The goal of the course is to improve programming and problem solving skills of the students by facing them with difficult problems and by presenting the techniques that help their reasoning in the implementation of correct and efficient solutions. The importance of these skills has been recognized by the most important software companies worldwide, which evaluate candidates in their job interviews mostly by the ability in addressing such difficult problems (e.g., see here).

A natural goal is to involve the students in the intellectual pleasure of programming and problem solving, also preparing them for the most important international online contests, such as Topcoder, Codeforces, HackerRank, CodeChef, Facebook Hacker Cup, Google Code Jam and so on, for internships in most important companies and their interviews. A desirable side-effect of the course could be to organize and prepare teams of students for online contests.

The course will provide the opportunity of

  • facing with challenging algorithmic problems;
  • improving problem solving and programming skills;
  • getting in touch with some big companies for internships, scholarships, or thesis proposals.

Exam

See these slides. Mandatory exercises for homeworks are in bold.

Extra points for

  • active participation
  • serious participation to online contests, e.g., CodeForces, TopCoder, Hacker Rank, Google Code Jam, ...
  • successful interview with a big company

Implementing solutions for the problems of each lecture is strongly recommended to improve your problem solving skill and to practice with Rust.

I recommend you to create a github repository to collect all your solutions and their descriptions. The repository can be either private or public. In both cases I should be able to access it. Please send me a link to your repository and keep the repository updated. I should be able to monitor your progresses.

Upcoming Exams

Type Date Room
Written/Lab 03/02/2022 9:00 Google Meet

Old Exams

Type Date Text
Written/Lab 23/01/2018 9:30 Text, TestSet, and Solution
Written/Lab 14/02/2018 9:30 Text, TestSet, and Quadratic solution
Written/Lab 12/06/2018 14:00 Text, TestSet, and Solution
Written/Lab 06/07/2018 9:30 Text and TestSet
Written/Lab 14/01/2019 14:00 Text and TestSet

How to solve a problem

  • Read carefully the description of the problem.
  • Make sure you understand the problem by checking the examples.
  • Design a first trivial solution.
  • Think about a more efficient solution. The use of some running examples usually helps a lot in finding a better solution. If your are not able to find such solution, try to find some hints by discussing with other students, by asking questions on the group, by looking at the solution in our Web page, or by searching on internet. This is perfectly fine for the first problems and for most difficult ones. In any case, make sure you really understand the solution and the properties it is exploiting!
  • Write a brief description of your solution in English. Provide an analysis of its time and space complexity.
  • Implement your own solution.
  • Submit your implementation to the problem's site. Fix it until it passes all the tests.
  • Always compare your solution and your implementation with existing ones.

Background

If you wish to refresh your mind on basic Algorithms and Data Structures, I suggest you to look at the well-known book Introduction to Algorithms, 3rd Edition by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein.

I strongly suggest you to watch the following video lectures as soon as possible.

References

  • Introduction to Algorithms,  3rd Edition, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, The MIT Press, 2009 (Amazon) [CCLR]
  • Algorithms, 4th Edition, Robert Sedgewick, Kevin Wayne, Addison-Wesley Professional, 2011 (Amazon) [RS]
  • Algorithms, Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani, McGraw-Hill, 2006. (Amazon) [DPZ]
  • Programming Challenges: The Programming Contest Training Manual, Steven S. Skiena, Miguel A. Revilla, Springer, 2003 (Amazon) [SR]
  • Competitive Programming 4: The New Lower Bound of Programming Contests, Steven Halim, Felix Halim, (here) [HH]
  • Guide to Competitive Programming: Learning and Improving Algorithms Through Contests. Second Edition, Antti Laaksonen, Springer, 2020 (here) [L]

Rust

C++

  • The C++ Programming Language, 4th Edition, Bjarne Stroustrup, Addison-Wesley Professional, 2013 (Amazon)
  • A Tour of C++, 2nd Edition, Bjarne Stroustrup, Addison-Wesley Professional, 2018 (Amazon)
  • The C++ Standard Library: A Tutorial and Reference, 2nd Edition, Nicolai M. Josuttis, Addison-Wesley Professional, 2012 (Amazon)

Useful links

Lectures

Date Lecture References Problems
15/09/2022 Introduction Slides Leaders in array (solution), Kadane's algorithm (solution), and Missing number in array (solution)
19/09/2022 Solutions of Trapping rain water and Sliding window maximum Rossano's notes* Trapping rain water (solution), and Sliding window maximum (solution)
22/09/2022 Analysis and correctness of Sliding window maximum. Brief introduction to Rust. Next greater element and Towers (solution)
29/09/2022 Searching and Sorting: Binary Search, Merge Sort, QuickSort, Counting Sort, and Radix Sort Rossano's notes*. [CCLR] Chapters 2.3, 7, and 8. Binary search. Exponential search. Interpolation search (optional) The Monkey and the Oiled Bamboo
03/10/2022 Searching and Sorting: Binary Search, Merge Sort, QuickSort, Counting Sort, and Radix Sort Inversion count and Two Types of Spells
05/10/2022 Hands-On 1. Deadline: 19/10/2022
10/10/2022 Trees: representation, traversals, and Binary Search Tree Rossano's notes*. [CCLR] Chapters 10.4 and 12. Frogs and Mosquitoes
13/10/2022 Lecture Cancelled!
17/10/2022 Trees: representation, traversals, and Binary Search Tree Rossano's notes*. Tree traversals. Maximum path sum (solution) and Longest k-Good Segment
20/10/2022 Trees: representation, traversals, and Binary Search Tree Euler Tour. Two pointers technique.
24/10/2022 (Static) Prefix sum Rossano's notes* Ilya and Queries (solution), Number of ways (solution), and  Little girl and maximum sum (solution)
27/10/2022 Segment Trees Segment Tree: description, tutorial 1, tutorial 2, tutorial 3, video, visualgo, slides and code. Solve Nested segments with Segment trees.
31/10/2022 Segment trees: Applications
03/11/2022 Segment Trees: Lazy Propagation and Persistency Segment Tree: description, tutorial 1, tutorial 2, tutorial 3, video, visualgo, slides and code. Lazy propagation: tutorial and video. Circular RMQ
07/11/2022 Exercises Triplets (Text and TestSet) and Smaller Values (Text and TestSet)
10/11/2022 Hands-On 2. Deadline: 23/11/2022
14/11/2022 Static RMQ with sparse table RMQ and sparse table: tutorial 1, tutorial 2, paper, and code. Static RMQ in 2n + o(n) bits and constant time(optional).
17/11/2022 Mo's algorithm on sequences and trees Rossano's notes*. Mo's Algorithm: Sequences and Trees Powerful array and Tree and queries
21/11/2022 Dynamic Programming: Fibonacci numbers, Rod cutting, and Shortest path on a DAG Rossano's notes* (or pdf). [CCLR] Chapter 15.
24/11/2022 Dynamic Programming: Minimum cost path and Longest common subsequence Rossano's notes* (or pdf). Martin Gardner on Minimum cost path. Longest common subsequence and Minimum number of jumps
28/11/2022 Dynamic Programming: 0/1 Knapsack, Fractional knapsack, and Subset sum. Rossano's notes* (or pdf). 0/1 Knapsack problem: tutorial Subset sum and 0-1 knapsack
01/12/2022 Dynamic Programming: Longest increasing subsequence and Coin change Rossano's notes* (or pdf) Longest increasing subsequence
05/12/2022 Dynamic Programming: Longest increasing subsequence, Longest bitonic subsequence, and Largest independent set on trees Rossano's notes* (or pdf) Longest bitonic subsequence
09/12/2022 Hands-On 3. Deadline: 23/12/2022

Lectures from past years

Date Lecture References Problems
2021 Prefix sum: Binary Indexed Tree (aka BIT or Fenwick tree) Rossano's notes*. BIT: description, tutorial, video, visualgo, and code. Update the array (solution)
2021 Applications of BIT and Range update with BIT. Rossano's notes*. Range updates on BIT. Tutorial. RMQ with BIT (optional) Nested segments (solution) and Pashmak and Parmida's problem (solution)
2017 Simulation of the exam Misha and forest
2017 Centroid Decomposition of trees Centroid Decomposition of trees: here, here, here, and here
2017 String algorithms: Knuth-Morris-Pratt and Suffix array Knuth-Morris-Pratt from [CLRS] Chapter 32.3. Knuth-Morris-Pratt. Optional: Rabin-Karp here from Algorithms on strings, trees, and sequences, D. Gusfield, Cambridge university press, here, and here. Suffix Array: Tutorial and implementation: here and here. Optional: Suffix Array in linear time here Longest prefix suffix and Shift the string
2017 String algorithms: LCP array, trie and ternary search trie Computing LCP array: Kasai et al.'s algorithm and here. Ternary search trie and a video.
2018 Standard Template Library (STL) Slides. Tutorial and STL algorithms Megacity (solution), Find pair (solution), and Two heaps (solution)
2018 Standard Template Library (STL). Coding Slides
2018 Heavy-light Decomposition of trees. This lecture is not mandatory. Heavy-light Decomposition of trees: here, here, and here. QTREE, QTREE2, QTREE3, GOT, and Chef and the tree.
2021 Greedy algorithms: Activity Selection, Job sequencing, and Fractional knapsack problem Rossano's notes*. Notes by Jeff Erickson. Job sequencing. Fractional Knapsack Problem N meetings in one room, Magic numbers, Wilbur and array, and Alternative thinking
2019 Greedy Algorithms: Boxes and Hero Rossano's notes*. Boxes and Hero. Huffman code: Section 7.4 in Notes by Jeff Erickson (optional). Lexicographically maximum subsequence, Woodcutters, and Queue
2021 Dynamic Programming: Edit distance, Longest palindromic subsequence, and Weighted job scheduling Rossano's notes* (or pdf) Edit distance, Vertex cover, and Longest palindromic subsequence
2021 Graph algorithms: BFS, DFS, and Topological Sort Rossano's notes*. [CCLR] Chapter 22 X total shapes, IsBipartite, and Fox and names
2021 Graph algorithms: Strongly Connected Components and Single-Source Shortest Path Rossano's notes*. [CCLR] Chapters 22 and 23 Learning languages and Checkposts
2019 Graph algorithms: Minimum Spanning Tree (and Disjoint Sets data structures) Rossano's notes*. [CCLR] Chapters 21 and 23. Kruskal: code, Disjoint Set: tutorial Minimum spanning tree

* Notes marked with "Rossano's notes" are rough and non-exhaustive notes that I used while lecturing. Please use them just to have a list of the topics of each lecture and use other reported references to study these arguments.

Further (optional) topics