Contest format • • • • 5 hours, around 8-12 problems One computer running (likely)Linux, plus printer 3 people on one machine No cell phones, calculators, USB drives, Internet (C++ STL available, cplusplus.com and java api’s are available) • All the paper resources you want, including books, print outs of code, anything! – If it fits in the van, bring it! Scoring • Sorted first by number of problems solved • Then sorted by time – If you submit a problem at :30 and one at 1:30, your total time is 120 minutes – Find the easy problems and do them first!!! – Watch the standings and see what other teams are doing! – 20 minute penalty for wrong answer on a single submission, but it’s only counted if you eventually solve that problem Submitting • You will receive one of several responses: – Format error – Time limit reached – Runtime error (division by 0, out of memory, exception thrown, etc.) – Compile error – Wrong answer – Correct! • The judges only give you one at a time – If you have two or more problems, you’ll usually only get the more embarrassing of them Always have someone typing • Typing and compiling is time intensive, and there’s only one keyboard – If your program isn’t working, print it and debug it by hand – Let someone else sit and type! • If you’re waiting for the computer, write some code out by hand or ask a neighbor for their opinion on your algorithm • If it has you read until end of input, use: while (cin >> x) Questions • You can submit questions to the judges about problems • Updates will be given to everyone if there is a typo or other error • You will get one of two responses: – A clarification – No answer (i.e. read the problem more closely) Test the judge’s input • They give you 1 or 2 sample inputs and solutions; test them! – There will normally be simple cases. • Make sure your format exactly matches the judge’s sample output! – They use a file compare (via a script) so it must be very close End cases • The judges are very tricky with their tests • If the problem says inputs will be between A and B, you can almost bet that inputs of size A and B will be tested • Be wary of carefully worded questions! Tree or not a tree • A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties: – There is exactly one node, called the root, to which no directed edges point. – Every node except the root has exactly one edge pointing to it. – There is a unique sequence of directed edges from the root to each node. Counting characters in a range • Input will consist of two integers, 0 < N < 100 • For each of the numbers in between these two numbers (inclusive), count the occurrences of each digit • Example: 17 21 – 17 18 19 20 21 – 0=>1 7=>1 1=>4 8=>1 2=>2 9=>1 • cin >> a >> b; for (i = a; i <= b; ++i) { ++arr[i / 10]; ++arr[i % 10]; } • 17 21 ? • 21 17 ? Be generous with your memory! • Make your arrays twice as big as necessary – Off by one error are difficult to find! • Use the STL (strings, vectors, everything!) • Use long long instead of int • Use double instead of float Code quickly at the cost of efficiency • The faster you type, the faster you submit! • Use the STL if it makes it easier for you – If you can’t remember how to use the STL sort, write a simple (bubble?)sort. Who cares! • Generally, if you get a “time limit reached”, your algorithm needs to be changed, not just little things in your code Helpful suggestion • Bring printed code, such as the algorithms we’ll talk about. • You won’t have to remember them and know you have a working/correct version too. – If someone is not typing in an answer, type in the algorithm so the template is ready to use. – Also data structures you may want to use (trees for example). – Including a “read a file” code. You know it works, then one least thing to think about. math • Number theory – Very popular in the program contests – For ICPC, you need a rather small but useful set • Prime table generation, primality testing, greatest common divisor, modular arithmetic and congruence (solving linear congruences), and Euler’s – A Note, Java’s BigInteger class has a number of number-theoretic functions, like gcd, modular exponentiation, primality testing, etc. String manipulation • There have been a number of string manipulation questions over the years. • Learn the string library – At the least substring, replace, find etc. – Regex maybe really helpful. algorithms • Brute force algorithms – From nested loop algorithms to backtracking (easier with recursion). • Breath first search. • Depth first search is recursive and has nice bracktracking features. • Dynamic Programming – Recursive algorithm that is composed of subproblems • Coin flipping and fibonacci are simple examples • Longest Common Subsequence (LCS), Longest Increasing Subsequence (LIS), Optimal Binary Search tree (OBST), 0-1 knapsack, edit distance, Matrix Chain Product are increasing harder examples. algorithms • Trees and priority queues, not necessary an algorithms, but can speed things up. • Graph theory – How to represent things and then use BFS and DFS, and topological sorting. • Does the graph have cycles? Classic Problems algorithms • • • • • Shortest paths (Dijkstra for example) Spanning trees (Prim or Kruskal) Eulerain paths and circuits Matchings in bipartite graphs Network flow (max flow, min cost flows) • Geometry. STL: Deque • #include <deque> • deque<int> x; • x.push_back(20); x.pop_back(); x.back(); x.push_front(20); x.pop_front(); x.front(); • x.resize(100); • x[10] OR x.at(10); • x.clear(); STL: Strings • • • • #include <string> string str; string str(“foo”); string str(10, ‘c’); str += “bar”; Find – – – – str.find(“aaba”); str.rfind(“aaba”); str.find_first_of(“AEIOU”); str.find_last_not_of(“AEIOU”, 5); Returns an int, or string::npos if none found • str.substr(int position, int length) STL: Algorithms • #include <algorithm> • swap(a, b); // Any type that has = can go here! • reverse(arr, arr + 10); reverse(deq.begin(), deq.end()); • Sorting – sort(arr, arr + 10); sort(deq.begin(), deq.end()); – sort(arr, arr + 10, lessThanFunction); bool lessThanFunction(const Type& t1, const Type& t2) { if (t1 < t2) return true; return false; } STL: Algorithms • #include <algorithm> • Permutations int x[] = {3, 5, 4, 1, 2}; sort(x, x + 5); do { // stuff } while (next_permutation(x, x + 5)); STL: formatting • #include <iomanip> • • • • • double d = 12345.6789; cout << d << endl; cout << setprecision(3) << d << endl; cout << setprecision(3) << fixed << d << endl; cout << setprecision(1) << fixed << 0.55 << endl; • • • • 12345.7 1.23e+04 12345.679 0.6 • • • • • int i = 42; cout << hex << i << endl; cout << hex << uppercase << i << endl; cout << i << endl; cout << dec << i << endl; • • • • 2a 2A 2A 42 Algorithms • Brush up on – depth-first search, breadth-first search (or just use iterative deepening DFS) • N-Trees, but lots of other uses as well. • minimum spanning trees http://en.wikipedia.org/wiki/Minimum_spann ing_tree – Lots of varying algorithms listed at the bottom of the page Algorithms (2) • shortest path, like Dijkstra’s algorithm – http://en.wikipedia.org/wiki/Dijkstra’s_algorithm – http://en.wikipedia.org/wiki/Shortest_path_probl em • (Max) flow problems – http://www-b2.is.tokushimau.ac.jp/~ikeda/suuri/maxflow/Maxflow.shtml • Good demo of max flow and min cut algorithms. • Also links to some other versions of spanning tree algorithms. Algorithms (3) • Greatest common divisor is a fun one to remember too – And remember, if gcd(a, b) == 1, then a and b are relatively prime! Dynamic programming/memoization • Recursive algorithm that is composed of subproblems – You keep recomputing the subproblems! – Save them in an array and look them up – Start with the recursive version first, then modify it to save work • Examples – Fibonacci – Coin problem Geometric algorithms Geometric algorithms • Intersection – Four points: a1, a2, b1, b2 – Compute: • • • • dir1 = direction(b1, b2, a1) dir2 = direction(b1, b2, a2) dir3 = direction(a1, a2, b1) dir4 = direction(a1, a2, b2) – If dir1/dir2 are opposite signs, and dir3/dir4 are opposite signs, they intersect b2 dir1 b2 a2 dir4 dir4 dir2 dir3 dir2 dir3 dir1 b1 b1 a1 a1 a2 4 5 3 2 1 6