Access my public notebook, a Notion workspace where I do my notes while studying and coding general-purpose algorithms. The book I recommend for studying is "Competitive Programming 3: The new lower bound of programming contests" by Steven Halim.
Feel free to follow my progress on my main online judge profiles:
- #greedy
- #dynamic-programming
- #ad-hoc
- #divide-&-conquer
- #techniques
- #searching
- #math
- #graphs
- #brute-force
- #computational-geometry
- π codeforces/659-D
- iterative
- π icpc/2014-01-uva-12801
- π uva/725
- π uva/10360
- π uva/628
- π icpc/2014-01-uva-12792:
simulation
β note that if you 'watch' a unique card, the full deck will become sorted as soon as this card reaches its original position - all subsets
- π uva/12455 β use bitmasks
- all permutations
- π uva/750
- recursive backtracking
- π uva/10344:
check if some arithmetic expression of 5 given numbers will result in 23
β check all combination of operators for each permutation of the given numbers - π spoj/MKJUMPS:
given an unweighted implicit graph, count the longest possible path
β DFS + backtracking - π code-jam/2020-QR-indicium-TLE:
generate M, where M[i][j] is any value in [1 .. N] (2 <= N <= 5), but without repeting a value in same line or column, and with the sum of the main diagonal equal to K
- π uva/10503:
given domino pieces, check if it is possible to arrive at a target piece from an initial piece using N intermediate pieces (possibly rotating them)
β DFS + backtracking - pruned permutations
- sudoku
- π uva/989
- n-queens
- π uva/11195 β use bitmasks
- π uva/10344:
- specials
- tree traversal
- π spoj/ONP:
transform the algebraic expression with brackets into reverse polish notation (RPN)
β consider the given expression as the in-order traversal in a binary tree, then print post-order traversal recursively without building the tree
- π spoj/ONP:
- tree traversal
- traversal
- π uva/11831 β consider grid as an implicit graph and walk through it, or just rotate the robot, for each received instruction
- π code-jam/2020-1A-pascal-walk-TLE
- π uva/12442:
given a graph with all vertices with out-degree 1, find the vertice that reaches the most vertices
- π uva/11906 β consider grid as an implicit graph and walk through it avoiding redundant positions (nr, nc)
- flood fill
- bipartite checking
- π uva/10004
- strongly connected components (SCC)
- π uva/11504:
count the number of SCCs without incoming edge from a vertex of another SCC
- π uva/11504:
- topological sorting
- π uva/11060
- bridges and articulation points
- π uva/796
- depth-first search (DFS)
- π codeforces/104-C:
check if the given undirected graph can be represented as a set of three or more rooted trees, whose roots are connected by a simple cycle
β check if the graph is connective and has only one cycle - π icpc/2019-01-uri-2965
- π codeforces/104-C:
- shortest path
- single-source
- unweighted graph
- π icpc/2014-01-uva-12797 β apply a BFS for each subset of letters possible (only 2^10) using bitmask
- weighted graph
- unweighted graph
- all-pairs
- π uri/2372
- single-source
- minimum spanning tree (MST)
- π uva/10034
- ad-hoc
- π uva/10812
- π uva/11875
- π icpc/2014-01-uva-12791
- π uva/10346
- π uva/11723
- π codeforces/1042-A
- sequences
- arithmetic progression
- π uva/11254
- finding pattern
- π uva/10161
- π spoj/EIGHTS
- π codeforces/1324-A
- π codeforces/1092-D1 β remove adjacent ones whose absolute difference is even (using a stack)
- π codeforces/1221-C
- π uva/11718 β compute K * N^(K-1) * sumA using fast power mod
- number theory
- π uri/2291:
print n-th divine number, the one that is equal to the sum of the sum of each divisor from 1 to n
- greatest common divisor (GCD)
- π codeforces/822-A
- π codeforces/854-A:
given n, determine maximum possible proper (a < b) and irreducible fraction a/b such that a+b == n
- prime numbers
- π spoj/PRIONPRI:
prime checking
- sieve of eratosthenes
- π uva/10539:
compute the quantity of non-prime numbers in [lo .. hi] which are divisible by only a single prime number, 0 < lo <= hi < 10^12
β generate all powers of each prime number - π codeforces/576-A
- π spoj/AMR11E:
print the n-th number that has at least 3 distinct prime factors
β use modified sieve - π spoj/PRIME1:
print all primes p in [m .. n], 0 <= m <= n <= 10^9, n-m <= 10^5
β sieve + prime checking
- π uva/10539:
- prime factorization
- π uri/2661:
compute the number of divisors of n that can be written as the product of two or more distinct prime numbers (without repetition), 1 <= n <= 10^12
β note that the product of any combination of prime factors of a number will always be a divisor of that number - π uva/10042
- π uva/10139:
do n! is divisible by m?
β check if the prime factors of m are contained in the prime factors of n!
- π uri/2661:
- π spoj/PRIONPRI:
- module arithmetic
- π uva/10176:
is a given binary number of 100 digits divisible by 131071?
- π uva/10176:
- π uri/2291:
- combinatorics
- fibonacci numbers
- π uva/10334 β compute (n+2)-th fibonnaci number
- binomial coefficient
- π codeforces/844-B
- π icpc/2019-01-uri-2972:
calculate the sum of C(N, k)%2 for all k in [0 .. n], i.e., how many odd combinations of k heads between n coins there are
β just compute 2^qtyBitsOn(n)
- fibonacci numbers
- game theory
- minimax
- π uva/10111:
given a state of a tic tac toe board, check if X will win independent of the O movement
β minimax + memo + backtracking - π uva/12484:
alberto and wanderley take one of two cards at the edges of the cards sequence, alberto want maximize it
β fill memo table in row-major order - optimized
- π uva/847:
multiplication game
β note that if Stan always multiply by 9 and Ollie by 2, it's still an optimal solution
- π uva/847:
- π uva/10111:
- minimax
- segment tree
- π codeforces/339-D
- lazy propagation
- π uri/2658 β build a segment tree for RSQ, but store an array of size 9 in tree[v], where tree[v][n] indicates the frequency that the note n appears in that interval
- π uva/11402 β build a segment tree for RSQ, but keep in lazy[v] the type of pending operation to be performed in that interval of A
- binary search
- π spoj/PAIRS1:
given the A array, count the quantity of pairs i < j such that A[i]-A[j] == K
β search on the sorted array A by the A[n]+K, for all n in [0 .. N-1] - π codeforces/1284-B
- π codeforces/1324-D:
given the A and B arrays, count the quantity of pairs i < j such that A[i]+A[j] > B[i]+B[j]
β diff being the A-B array, count, for all i in [0 .. N-2], how many times -diff[i] < diff[j], for all j in [i+1 .. N-1] - π codeforces/91-B:
given the array a, compute the array d, where d[i] = j-(i+1) for the max j such that a[j] < a[i]
β apply binary search on preprocessed array mn, filled from right to left - on answer
- π icpc/2019-01-uri-2973
- π spoj/AGGRCOW:
given an array A of size N (2 <= N <= 10^5), print the largest minimum distance between any two of C (C <= N) elements choosen any
- π codeforces/1223-C
- π codeforces/460-C
- π uva/12097
- π spoj/PAIRS1:
- two pointers
- π codeforces/279-B
- π codeforces/1041-D
- π codeforces/381-A
- π uva/967:
pope
- π codeforces/676-C
- π codeforces/6-C
- π codeforces/768-B β knowing the size of the final array with a little math, use the same idea to query a range in a segment tree
- π codeforces/1220-A
- π code-jam/2020-1C-overexcited-fan
- π spoj/ADAQUEUE
- π icpc/2019-01-uri-2963
- π uri/2242
- π icpc/2019-02-uri-3024
- π codeforces/37-A
- π icpc/2019-01-uri-2968
- π spoj/SBANK
- π spoj/EC_CONB
- π codeforces/1285-A
- π uva/12015
- π uri/2879
- π codeforces/151-A
- π icpc/2014-01-uva-12798
- π uri/1368
- π uri/2884
- π uva/10141
- π code-jam/2019-QR-foregone-solution
- π uva/11799
- implementation
- π codeforces/266-A
- π uri/1261
- π uri/1763
- π uri/1260
- π uri/2593
- π spoj/GNY07D
- π icpc/2019-01-uri-2971
- π codeforces/158-C
- π codeforces/373-A
- π uri/1975
- π codeforces/1254-A
- π uri/1215
- π codeforces/1296-C β maps each position of the robot with the string index, and check if a new position has already been mapped before
- π codeforces/1284-A
- π codeforces/811-B
- π codeforces/519-C
- π codeforces/81-A
- π codeforces/492-B
- π code-jam/2020-QR-vestigium
- π codeforces/110-A
- π codeforces/1061-C β use space saving + all divisors in O(sqrt(n)) to optimize
- π uva/10943
- π uva/10721
- π uva/10003
- π uva/10337
- π uva/11450
- π uva/10651 β use bitmasks
- π codeforces/166-E
- digit
- π uri/1707:
given two numbers x and y, compute the sum of the decimal digits of the odd numbers in the range [min(x,y) .. max(x,y)]
- π spoj/CPCRC1C
- π uri/1707:
- longest increasing subsequence (LIS)
- coin change (CC)
- π codeforces/189-A
- π codeforces/1255-A
- max 2D range sum
- traveling salesman problem (TSP)
- 0-1 knapsack
- π uri/1487
- π spoj/KNAPSACK
- π spoj/SCUBADIV
- π uri/2498
- subset sum
- max 1D range sum
- π uva/787:
max 1D range product query
β compute for each sub-range without 0 - kadane
- π uva/12640:
find the max range sum considering the possibility of a sub-range of length 0
- π uva/10684
- π codeforces/1285-B
- π spoj/MAXSUMSU
- π uva/12640:
- π uva/787:
- longest common subsequence (LCS)
- π spoj/ADASEQEN
- π spoj/IOIPALIN:
given a string, determine the minimal quantity of characters to be inserted into it in order to obtain a palindrome
β compute length of string minus lcs between string and reversed string
- π code-jam/2020-1A-pattern-matching β note that only the prefix and suffix constraints matter
- π codeforces/275-C
- π spoj/GERGOVIA
- π spoj/SNGINT:
given an integer n, find the smallest positive integer m > 0 such that the product of digits of m equals n
- π code-jam/2020-QR-parenting-partnering-returns
- π codeforces/545-D
- π codeforces/1092-B
- π codeforces/204-B:
given the two-sided values of N cards, what is the minimum number of turns in the cards so that at least half of them are the same front?; they are initially facing upwards
- π codeforces/1257-A
- π uva/10954:
add all
- π codeforces/1324-B:
given a sequence of integers, is there a subsequence palindrome of size 3?
β check if there are two equal non-adjacent numbers using brute force - π codeforces/1324-C β note that it's unnecessary jump to the left, so to minimize d, just jump between the nearest 'R' cells
- π spoj/CADYDIST
- π spoj/BUSYMAN:
compute the maximum number of activities (each with start and end times) that you can do without overlapping them (one at a time)
β sort the activites by increasing end time - π codeforces/984-A
- π code-jam/2020-QR-nesting-depth
- π codeforces/1237-C2 β sort the points, remove pairs with equal x and y first, then pairs with equal x and finally the rest
- loading balance
- interval covering
- π uva/10382:
reduce the problem using pythagoras to one line
- π uva/10382:
- fast longest increasing subsequence (LIS)
- π uva/481
- bipartite matching
- π uva/11292