Skip to content

Latest commit

 

History

History

solutions

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Feel free to follow my progress on my main online judge profiles:


Solutions index

· #geometry · #strings · #brute-force · #dynamic-programming · #data-structures · #greedy · #math · #ad-hoc · #divide-&-conquer · #miscellaneous · #graphs ·

graphs

  • minimum spanning tree (MST)
    • 🙂 spoj/MST
    • 🙂 uva/11710
    • 🙂 uva/10034
    • 🙂 uva/1174
    • minimax path
      • 😳 uva/10099: maximin path; find the minimum cost of the maximum path from s to t → apply kruskal to get the maximum spanning tree, but stop it when s and t connect
      • 🙂 uva/10048
    • minimum spanning subgraph
      • 😳 uva/10397: given an implicit complete graph and some edges, compute the cost of the minimum spanning subgraph
  • shortest path
    • all-pairs
    • single-source
      • negative-weighted and cycle graph
        • 😳 at-coder/ABC137-E: longest distance from 0 to V-1, checking for positive cycle that are part of that path (0 to V-1)
      • weighted graph
        • 😳 uva/11833 → build the graph already with the given constraints
        • 😳 uva/10806: find the global shortest path from 0 to V-1 (round trip), without repeting edges
        • 🥵 uva/11367 → find the shortest path on state-space graph, where each vertex represent a city and a level of car fuel
        • 🥵 live-archive/3652: dijkstra on a given implicit graph as a 2D grid
        • 😳 uva/12144: almost shortest path
      • unweighted graph
        • 😳 uva/12797 → apply a BFS for each subset of letters possible (only 2^10) using bitmask
  • traversal
    • 😳 code-jam/2020-1A-pascal-walk-TLE
    • 😳 uva/11906 → consider grid as an implicit graph and walk through it avoiding redundant positions (nr, nc)
    • 🙂 uva/11831 → consider grid as an implicit graph and walk through it, or just rotate the robot, for each received instruction
    • bridges or articulation points
      • 🙂 uva/796
      • 🥵 uva/12363: given an undirected graph, check if there is a unique path between 2 query vertices → there is a unique path between s and t if the path between them is formed only by bridge edges; for optimize, keep sets for the vertices that are on the same connected component in the pruned graph (with only bridge edges)
      • 🥵 codeforces/178-B3: given an undirected graph, count how many bridge edges exists between 2 query vertices → group the vertices connected by non-bridge edge during dfs; generate a tree considering each group as a vertice, and using only the bridge edges; find the distance between 2 query vertices of that tree with LCA in O(1)
    • bipartite checking
    • flood fill
      • 🙂 uva/11094
      • 🥵 uva/1103 → consider each pixel as a vertex of an implicit graph, then identify each hieroglyph counting the number of white CCs within it
    • topological sorting
    • depth-first search (DFS)
    • strongly connected components (SCC)
      • 😳 uva/11504 → count the number of SCCs without incoming edge from a vertex of another SCC
    • edge classification
      • 🙂 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
      • 🙂 codeforces/510-B: check if a given implicit undirected graph has a cycle of length >= 4
  • maximum flow
    • 😳 uva/10779 → each friend receives 1 flow unit of a sticker and offers a flow of other sticker; Bob also offers, but he receives 1 flow unit of each sticker; maximized it
    • 🙂 uva/820
    • minimum cost
  • specials
    • 😳 uva/12442: given a graph with all vertices with out-degree 1, find the vertice that reaches the most vertices
    • bipartite
      • bipartite checking
      • max cardinality bipartite matching
        • 😳 uva/10080: max number of preys that can hide safely from an predator attack → consider a bipartite graph with edges that connect a gopher (prey) to an reachable hole
        • 😳 uva/11262 → binary search on answer + MCBM
    • tree
      • 🙂 spoj/LABYR1: compute the diameter of a given implicit tree
      • 😳 spoj/ONP: infix to postfix conversion → see that the given expression is the in-order traversal in a binary tree, then print post-order traversal recursively without building the tree
      • 🙂 codeforces/115-A: given a forest, find the length of the longest path
    • directed acyclic graph (DAG)
      • 🙂 uva/988: counting paths from 0 to V-1

miscellaneous

divide & conquer

  • 😳 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

ad-hoc

math

  • combinatorics
    • 🙂 codeforces/459-B: find the max difference between numbers of a given array and the number of ways to get it
    • 🙂 codeforces/131-B
    • combinations
      • binomial coefficient
        • 🥵 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)
        • 🙂 codeforces/844-B
      • multi-combinations
    • fibonacci numbers
      • 😳 uva/10334 → compute (n+2)-th fibonnaci number
  • ad-hoc
  • number theory
    • 😳 uva/547: find the longest DDF sequence → pre-process a array f, where f[i] is the sum of digits of all positive factors of i; think like sieve
    • 😳 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 → think like sieve
    • greatest common divisor (GCD)
      • 🙂 codeforces/854-A: given n, determine maximum possible proper (a < b) and irreducible fraction a/b such that a+b == n
      • 😳 codeforces/75-C: find the gcd(a, b) that is in a query range [lo .. hi] → note that all divisors of gcd(a, b) are also divisors of a and b
      • 🙂 codeforces/822-A
    • 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
        • 🙂 spoj/AMR11E: print the n-th number that has at least 3 distinct prime factors → use modified sieve
        • 😳 codeforces/576-A
        • 🙂 codeforces/230-B: check if a large n has exactily three distinct positive divisors → check if sqrt(n) is prime
        • 😳 spoj/PRIME1: print all primes p in [m .. n], 0 <= m <= n <= 10^9, n-m <= 10^5 → sieve + prime checking
      • prime factorization
        • 🙂 uva/10042
        • 🥵 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/10139: do n! is divisible by m? → check if the prime factors of m are contained in the prime factors of n!
    • module arithmetic
      • 🙂 uva/374: compute (a^n) % m, where a <= 2^31 and n <= 2^31 → use fast power with mod
      • 🙂 uva/10176: is a given binary number of 100 digits divisible by 131071?
  • matrix exponentiation
    • 🙂 uva/10229 → transform the fibonacci recurrence into a matrix exponentiation
  • 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

greedy

data structures

  • segment tree
    • 🙂 codeforces/339-D
    • 🙂 live-archive/6139: range product query
    • lazy propagation
      • 😳 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
      • 😳 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
  • sparse table
  • binary search
    • 😳 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
    • 😳 codeforces/1284-B
    • 🙂 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]
    • on answer

dynamic programming

  • 🙂 spoj/TRT → don't memoize the current day
  • 🙂 uva/10337
  • 😳 codeforces/1061-C → use space saving + all divisors in O(sqrt(n)) to optimize
  • 🙂 uva/10943
  • 🙂 uva/11000
  • 😳 codeforces/166-E
  • 😳 uva/10721
  • 🙂 uva/10003
  • 🙂 uva/11450
  • 😳 uva/10651 → use bitmasks
  • 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
  • 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
  • max 1D range sum
  • max 2D range sum
    • 🥵 uva/10755: max 3D range sum → use max 2D range sum in two of the three dimensions and max 1D range sum (kadane) on the third dimension
    • 🙂 uva/108
  • 0-1 knapsack
  • subset sum
    • 🙂 uva/624: print the subset of A with the max sum k, k <= K
    • 😳 uva/10616: given an array of size N, count how many subsets of size M have their sum divisible by D → use module arithmetic
    • 😳 uva/11658: find the smallest sum s of a subset of A, s >= S → scan as %d.%d
    • 🙂 uri/1203: check if any subset of A has a sum equal to K
    • with repetition
  • traveling salesman problem (TSP)
  • longest increasing subsequence (LIS)
    • 😳 uva/10131 → sort elephants based on increasing kg, then apply LDS on iq
    • 🥵 uva/481
    • 😳 uri/1517
    • 😳 uva/11456 → find the max(lis[i]+lds[i]-1) for all i in [0 .. N-1], being i where the subsequence starts
  • coin change
    • 🙂 uva/11407 → consider the coins as the perfect squares
    • 🙂 codeforces/189-A
    • 😳 uva/166: coin change with limited amount of coins + greedy coin change with unlimited amount of coins; I don't know why, but it works without memo

brute force

  • iterative
  • recursive backtracking
    • 🙂 live-archive/2883: chess with a single horse against up to 8 pawns; print the length of the minimum sequence of horse moves if it wins
    • 🙂 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
    • 🙂 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
    • sudoku
    • pruned permutations
    • n-queens

strings

  • suffix array
    • 😳 spoj/SARRAY: just build a suffix array in O(N * log N)

geometry