jeffreyxiao
Hi! I'm a student at the University of Waterloo studying software engineering. I have an interest in large scale distributed algorithms and infrastructure for data analytics. I also enjoy working with low level systems.

CCC 2016 Analysis

Wednesday, February 17, 2016

ProgrammingCompetition

Introduction

I recently wrote the CCC Senior Division. I just wanted to share my analysis for each problem.

S1: Ragaman

First let us consider the number of matched characters in string one and string two. If there are characters in string two that cannot be matched with characters in string one, it cannot be an anagram. We don't have to consider the number of wildcards because we can just match it with the unmatched characters in string one. Therefore, just keep a count of the characters in string one subtracted by the characters in string two. If there are more characters of one individual letter in string two than string one, it cannot be an anagram.

Time complexity: O(N)O(N)

Link to Code

S2: Tandem Bicycle

For both problems, sort the speeds from Dmojistan and Pegland in increasing order. If you want the minimum total speed, always pair the fastest from Dmojistan with the fastest from Pegland, the second fastest from Dmojistan with the second fastest from Pegland, and so on. If you want the maximum total speed, always pair the slowest from Dmojistan with the fastest from Pegland, the second slowest from Dmojistan with the second fastest from Pegland, and so on. It can be mathematically proven that this will always yield the maximum/minimum total speed.

Time complexity: O(N log N)O(N\ log\ N)

Link to Code

S3: Phonomenal Reviews

Let us observe that any subset of vertices induces a subtree on the original tree and that we have to visit every vertex in the induced subtree to visit all the Pho restaurants. Next, let us consider an easier problem where we have to return to our starting position. The total distance travelled will be the number of edges in the subtree multiplied by two. Finally because we don't have to return to our original position, we want to subtract the longest distance in the tree. Thus our final answer will be the number of edges in the subtree multiplied by two subtracted by the longest path distance in the subtree.

Time complexity: O(N)O(N)

Link to Code

S4: Combining Riceballs

Let dp[l][r]={true if [l,r] can be combinedfalse otherwise\text{Let dp}[l][r] = \begin{cases} \text{true if } [l, r] \text{ can be combined}\\ \text{false otherwise} \end{cases}

If we loop through all possible values of [l,r][l, r] where 1<=l<=r<=N1 <= l <= r <= N and take the max of the rice ball sums where dp[l][r]=true\text{dp}[l][r] = \text{true}, we can obtain our answer.

In order to compute dp[l][r]\text{dp}[l][r], we have to consider a couple of cases:

If r=l, then dp[l][r]=true\text{If } r = l, \text{ then dp}[l][r] = \text{true} If rl<=2, then dp[l][r]={true if dp[l][l]=dp[r][r]false otherwise\text{If } r - l <= 2, \text{ then dp}[l][r] = \begin{cases} \text{true if dp}[l][l] = \text{dp}[r][r]\\ \text{false otherwise} \end{cases} If rl>2, then dp[l][r]={true if dp[l][i]=dp[j][r] where l<=i<j<=rfalse otherwise\text{If } r - l > 2, \text{ then dp}[l][r] = \begin{cases} \text{true if dp}[l][i] = \text{dp}[j][r] \text{ where } l <= i < j <= r\\ \text{false otherwise} \end{cases}

For the last case, looping through ii and jj uses two for loops bringing the total time complexity to O(N4)O(N^4), but you can reduce that to O(N3)O(N^3) using maps or the two pointer method by making the observation that each prefix/suffix is monotonically increasing.

Time complexity: O(N3)O(N^3)

Link to Code

S5: Circle of Life

Let us make a couple of observations first:

  1. This set of rules of 1D cellular automaton is called Rule 90.

It has a property of addictivity meaning that if two initial states are combined by computing the exclusive or of each of their states, then their subsequence configurations will be combined in the same way. For example, the second generation of 01010 can be computed by the XOR of the second generation of 01000 and 00010

  1. A simulation of 000...0001000...000 yields the Sierpinski's Triangle
  2. The 2ith2^i\text{th} row of the Sierpinski triangle has exactly two ones.

Using these three observations, we can compute the 2ith2^i\text{th} row of any generation in O(N)O(N) time. By decomposing TT into a set of powers of two, we can obtain a time complexity of O(N log T)O(N\ log\ T).

Time complexity: O(N log T)O(N\ log\ T)

Link to Code

Introduction
S1: Ragaman
S2: Tandem Bicycle
S3: Phonomenal Reviews
S4: Combining Riceballs
S5: Circle of Life
Previous Post
Machine Learning Notes
Next Post
CCOQR 2016 Analysis