<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://wgma.ca/feed.xml" rel="self" type="application/atom+xml" /><link href="https://wgma.ca/" rel="alternate" type="text/html" /><updated>2026-04-10T05:38:21+00:00</updated><id>https://wgma.ca/feed.xml</id><title type="html">William Granados</title><subtitle>Personal site and blog of William Granados.</subtitle><author><name>William Granados</name><email>me@wgma.ca</email></author><entry><title type="html">Investments Basics</title><link href="https://wgma.ca/blog/2021-01-24/investments" rel="alternate" type="text/html" title="Investments Basics" /><published>2021-01-24T00:00:00+00:00</published><updated>2021-01-24T00:00:00+00:00</updated><id>https://wgma.ca/blog/2021-01-24/investments</id><content type="html" xml:base="https://wgma.ca/blog/2021-01-24/investments"><![CDATA[<p>So upon graduation, me like any other student has come across the question, what now? 
Well if you’re lucky maybe you’ll have a job, and this will help you get started in the right direction.</p>

<h1 id="income">Income</h1>

<p>There’s a couple of ways to make money, but one of the most common include salaried jobs. 
There are a couple of ways that people in tech get compensated but most follows the pattern of:
(Cash)</p>
<ul>
  <li>signing bonus</li>
  <li>performance bonus</li>
  <li>annual salary</li>
</ul>

<p>(Equity)</p>
<ul>
  <li>Residual Stock Units (RSU), or options</li>
</ul>

<p>Most cash based compensation are straight foward, equity based compensation is a bit different.</p>

<p>If your company is public and is trading shares in the NASDAQ or TSX then you will likely get RSU. These usually consist of a grant date that locks the intial price of your stock, then a vesting period (usually 1 year).</p>

<p>If your company is pre-ipo you will likely get stock options and than you can exercise these options (i.e. purchase as set price below IPO price) once a company IPOs. These usually have a set 6 month period before you can decide to sell.</p>

<h2 id="deductions-ie-taxes">Deductions (i.e. Taxes)</h2>

<p>The not so fun part of income taxes,  these usually contain the federal and provincial portion of the your taxes, along with payments to cpp/ei. Canada has a tier based tax system that I will try to explain (image obtained from <a href="https://www.taxtips.ca/taxrates/on.htm">taxtips.ca</a>). Here the terminology you need to know:</p>

<p><strong>Other Income:</strong> This includes your cash based and equity based compensation.</p>

<p><strong>Capital gains:</strong> These are taxes on when holding stock investments. An example: vested stocks that you didn’t sell that increased in price would be taxed under this column.</p>

<p><strong>Dividends:</strong> This is passive income you receieve from something like bonds</p>

<p><strong>Marginal Tax Rate:</strong> That highest tax bracket you’re in. I.e. if you earned $1000 more in your annual income, your highest tax bracket determines how much of that you’ll keep.</p>

<p><strong>Average Tax Rate:</strong> The average of tax paid in all brackets, usually it’s something like 33% of your yearly income. This is useful for calculating your take home income after taxes.</p>

<p><img src="/images/tax-breakdown.png" alt="Important chart" /></p>

<h1 id="debts--student-loans">Debts / Student loans</h1>

<p>Most students in ontario take out OSAP whias is split up in a federal and provincial portion of your loan.  These interested on each portion is calculated as the <a href="https://www.ratehub.ca/prime-rate">prime rate</a> (around 2.45% in 2021), along with a flat amount  (0% for federal, 3% for provincial).  In my experience the provincial part is pretty low, so I’d effectively be paying a 3% interest for my loan.</p>

<h1 id="tax-advantaged-accounts">Tax advantaged accounts</h1>

<p>Usually you’d be taxed captial gains on your investments, but these are special accounts provided by the government that help you dip your toes into investments.</p>

<h2 id="rrsp">RRSP</h2>

<p>The maximum amount that you can deposit per year to this type of account is the minimum of 20% of your income or $29210 (<a href="https://www.canada.ca/en/revenue-agency/services/tax/registered-plans-administrators/pspa/mp-rrsp-dpsp-tfsa-limits-ympe.html">source</a>). Any money withdrawn <strong>cannot</strong>  cannot increase your deposit limit (hence you lose the benefit of compound interest).</p>

<p>These deposit can be carried over to the next year. But the important these contributions can be used as a <strong>tax deduction</strong>. You can think of it as a hyperbolic time chamber where you would the taxes you would normally at a later date. Upon withdrawel any item you would withdraw is counted as other income (which you can refer to above).</p>

<p>Ideally if you’re working and in a higher tax bracket (i.e. 45% marginal tax bracket), if you were to be at a lower tax bracket later (i.e. retired), then you could withdraw from it and be in a lower marginal tax rate (i.e. 20% for up to 45k). So you ideally pay less  taxes and can pay for retirement.</p>

<p>Some employers also offer employee matching up to a certain percent of your annual income (i.e. 3%). These are great because you can think of it as free money in the future!</p>

<p>Another advantage of your is you may be eligble for the <a href="https://www.canada.ca/en/financial-consumer-agency/services/buying-home.html"> HBP</a>. This allows first time home buyers to withdraw up to 35k tax free from their RRSP that can be towards your home purchase. This you normally have to pay back in full after 10 years. but it’s pretty good since because you can your pretax money to work as an interest free loan.</p>

<h2 id="tfsa">TFSA</h2>

<p>The maximum amount you can deposity per year is generally $6000, and this is accumlated from the year you turn 18 (sorry if you’re younger you can’t have one :( ). You never have to pay any forms of taxes on gains in these account (yay). If you withdraw money than your maximum deposit gets refreshed the following year.</p>

<p>These are really great because you don’t have to pay capital gains on any income, and you can freely withdraw money without it pushing you to a higher tax bracket.</p>

<h2 id="investment-options">Investment Options</h2>

<p>There’s a distriction between passive and active investments strategies for these accounts.</p>

<p>Generally big banks like to actively invest in your accounts (i.e. mutual funds, hand picking stocks/bonds) and they charge alot, while other places invest in index funds (i.e. ETFS) that model the market.</p>

<p>A popular passive investment platform is the robo advisor <a href="https://www.wealthsimple.com/en-ca/">WealthSimple</a> because it’s hand free and you don’t have to pick investments yourself. If you want to actively invest you can try <a href="https://www.wealthsimple.com/en-ca/product/trade/">WealthSimple Trade</a>.</p>

<h1 id="budgeting">Budgeting</h1>

<p>The following is a <a href="https://docs.google.com/spreadsheets/d/1dqsKXEj8hXN2UtO_y80AYbf6gemPsLKazHiMIerdqqM/edit?usp=sharing">spreadsheet</a> I made with the help of some friends to make budgeting easier. Good luck!</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="stocks" /><category term="taxes" /><category term="other shit" /><category term="stocks" /><category term="taxes" /><summary type="html"><![CDATA[So upon graduation, me like any other student has come across the question, what now? Well if you’re lucky maybe you’ll have a job, and this will help you get started in the right direction.]]></summary></entry><entry><title type="html">Why I play a text based game in 2020</title><link href="https://wgma.ca/blog/2020-01-18/torncity" rel="alternate" type="text/html" title="Why I play a text based game in 2020" /><published>2020-01-18T00:00:00+00:00</published><updated>2020-01-18T00:00:00+00:00</updated><id>https://wgma.ca/blog/2020-01-18/torncity</id><content type="html" xml:base="https://wgma.ca/blog/2020-01-18/torncity"><![CDATA[<p>So I get a lot of comments when people learn that I’ve been playing a bland looking RPG for the past 10 years. 
Well, today, I plan to take a trip down memory lane.</p>

<h2 id="the-game-torn-city">The Game: Torn City</h2>

<p><img src="/images/torn.jpg" alt="" /></p>

<p>To give you an idea of what the game is like, let’s look at the description: “Torn is a text-based online RPG set in Torn City, a dark, murky underworld where only the sharpest survive. In Torn City you can be anyone and do anything. Build your character to infinite strengths and play it.”</p>

<p><img src="/images/torn-screen.png" alt="" /></p>

<p>Now, how can such a bland looking game manage to keep my attention for the past 10 years, you may ask? Well, it’s actually a very feature rich text-based game that has many people around the globe addicted. I’ve known of several people who tried to quit the game, only to come back to it in a few years full circle. What could possibly be the reason for this?</p>

<h3 id="the-community">The Community</h3>
<p>Torn is a very diverse community attracting player sfrom all over the world. x`</p>

<h3 id="gameplay">Gameplay</h3>
<p>Most of your time consists of hitting the gym.</p>

<p>doing missions</p>

<p>travelling for money</p>

<p>trading items</p>

<p>faction wars / chaining</p>

<p>trolling on forums</p>

<p>signature making</p>

<p>doing crimes / making money</p>

<p>Some interesting links: <a href="https://venturebeat.com/2009/10/08/torn-online-game-free-to-play-makes-developer-a-millionaire/"> Game creator becomes a millionare </a>, <a href="https://www.youtube.com/watch?v=wwdsLc1AulU"> Torn City news Eps 32</a></p>

<h2 id="the-older-past10-yrs-ago">The Older Past(10 yrs ago)</h2>

<p>I’m about 3900 days old today, which means I made my account around May 2009. My first encounter with the game was a few years back on a school computer (2007-2008).</p>

<p>When I first encountered the game, I didn’t think much of it. I mean, the grey colour is not all that appealing to the eye.
And honestly I have forgotten the password/username/email associated with that account. It wasn’t until a few years later that I found my cousin playing Torn and this caught my interest again.</p>

<p>Back in those days the only popular games I knew of were <a href="https://www.y8.com/games/playing_with_fire_2">playing with fire</a>, and  <a href="https://www.newgrounds.com/"> newgrounds</a>. I also had a pretty slow computer so I couldn’t really play any intensive games like runescape.</p>

<p>While I was playing these games I met a lot of cool people from around the world, who resided in: UK, Scotland, UAE, and from the US. I learned a lot about their cultures, and I remember spending nights on messengers talking about hunting the <a href="https://www.atlasobscura.com/articles/what-is-haggis">wild haggis</a>. Most of these people were from a different game I played at the time called <a href="http://citystruggle.com/">city struggle</a>, however that game was shut down sometime around 2011, due to unforeseen reasons. So a lot of us migrated to torn city, and the few who didn’t remain a mystery (like ViralVengeance, leader of Deviance).</p>

<p>So, since CS was a pretty big part of my life, I stayed in contact with the few people still on torn. But over the next year those people became less active. This lonesome year resulted in me taking a three year hiatus (around the time highschool started).</p>

<h2 id="the-old-past-6-yrs-ago">The Old Past (6 yrs ago)</h2>

<p>During my final year of highschool around the time I was stressing about getting into University, I decided to take a break from it all and play a little bit of torn. One thing led to another and I found myself now trying to reach the “stat cap” milestone in each category. I thought to myself if I was gonna get serious at any point in this game, having reached the stat cap would be useful.</p>

<p>It was around this time I made a new group of friends in a faction called Sadistic which was run by a business student in Myanmar, and US veteran. While I was there I learned about “chaining” attacks feature which involved users staying up to make attacks on other users in 5 min windows, to raise a hit counter. This was pretty fun since it required a lot of communication and grit to be able to get some longer chains going like the 500 ones. Unfortunately this experience didn’t last long when the team disbanded, so I joined a bigger faction at the time called Momento Mori (M†M).</p>

<p>I started getting more involved in the scene since M†M was a top 20 faction at the time. They weren’t pushovers either, and they frequently did much longer chains than the ones in Sadistic (in the realm of 1000-5000) since they had a larger active userbase. I leanrned a fair bit of warring and chaining from that faction which I’m very grateful for. Unfortunately this faction didn’t last long either once the leader Tascon decided to sell it.</p>

<h2 id="the-somewhat-present---now-2-yrs-ago">The Somewhat Present - Now (2 yrs ago)</h2>

<p>At this point I managed to reach the goal I wanted but I wasn’t really fully set on the game, so I decided to join another top 20 faction called destructive angels (sister faction of destructive anomoly [top 5 faction]). I thought, “maybe I could move up to the top faction”. Unfortunately, this faction ended up disbanding disbanding. And at the time I remember how difficult it would be to have 10k chains.</p>

<p>So I decided I wanted to join a really active faction where I could basically be lazy asf and just throw in my hits during the exam season without worrying to keep the chain alive. So at the time I remember seeing 39th Street Killers X (X stands for elite) they were doing 25k chains effortlessly over weekends and pulling in a lot of money through organised crimes. Keep in mind a 10k chain might take me a week to do in my old factions, so I was very impressed.  I talked with the faction leader, told him about my history and I mentioned the points above, and just like that I was in. After years of not being sure if I’d play legitimately I was now in a top 5 faction, and my overall in game stats were starting to look a lot better.</p>

<p>I’ve been in the faction for a year now and moved up to main faction (39th Street Killers), and honestly I feel like my decision back then was right. There are lots of smart and dedicated people here, and I feel like I keep meeting new intersting people. Well let’s see how long this will last :)</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Torn" /><category term="MMORPG" /><category term="life" /><category term="gaming" /><summary type="html"><![CDATA[So I get a lot of comments when people learn that I’ve been playing a bland looking RPG for the past 10 years. Well, today, I plan to take a trip down memory lane.]]></summary></entry><entry><title type="html">CCC/CCO Selected Solutions (2010-2014)</title><link href="https://wgma.ca/blog/2020-01-10/ccosolutions" rel="alternate" type="text/html" title="CCC/CCO Selected Solutions (2010-2014)" /><published>2020-01-10T00:00:00+00:00</published><updated>2020-01-10T00:00:00+00:00</updated><id>https://wgma.ca/blog/2020-01-10/ccosolutions</id><content type="html" xml:base="https://wgma.ca/blog/2020-01-10/ccosolutions"><![CDATA[<script type="text/javascript" async="" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>

<h1 id="introduction">Introduction</h1>

<p>I actually wrote all of editurials when I was in highschool, and had them on my old blog. 
I removed it because I couldn’t find a good way to organize it at the time, but now I have a better idea. 
I hope anyone thinking of competiting in this competition will find these useful :)</p>

<h1 id="table-of-contents">Table of Contents</h1>

<h1 id="solution-for-ccc10s3---firehose">Solution for <a href="http://wcipeg.com/problem/ccc10s3">CCC10S3 - Firehose</a></h1>

<p>This problems asks us to find the minimum length of hose required to connect a series of houses if were only given K fire hydrants from which to extend our hose from. We must then take into consideration the maximum hose length possible is 1,000,000, because this number is so large we know that a simple iterative solution will likely not run in time. What we need to notice is that once we have found one possible hose length that satisfies the condition above we do not need to consider hose lengths that are longer, likewise we also have to notice that if the current hose length does not satisfy the conditions then all hose lengths less than this hose length are also impossible. Once we see this property the problem becomes a trivial binary search problem, we’re using binary search on the hose length.
te</p>

<p>Now that this idea has been formulated we must define a predicate. The predicate should be if the current hose length is possible then the upper bound is now the hose length, otherwise the lower bound is now equal to the hose length. In provided solution the predicate written has a time complexity of \(O(H^2)\) where \(H\) is the number of houses and the binary search has a time complexity of \(O(\log{}L)\) where \(L\) is the length of the hose.</p>

<p>Time complexity: \(O(H^2\log{}L)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span><span class="cpf">&lt;cstdio&gt;</span><span class="cp">
#include</span><span class="cpf">&lt;cstring&gt;</span><span class="cp">
#include</span><span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span><span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXH</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">H</span><span class="p">,</span><span class="n">K</span><span class="p">,</span><span class="n">lo</span><span class="p">,</span><span class="n">hi</span><span class="p">,</span><span class="n">mid</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">house</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">v</span><span class="p">[</span><span class="n">MAXH</span><span class="p">];</span>


<span class="cm">/*minimum between distance taking wrapping into consideration*/</span>
<span class="kt">int</span> <span class="nf">dist</span><span class="p">(</span><span class="kt">int</span> <span class="n">h1</span><span class="p">,</span><span class="kt">int</span> <span class="n">h2</span><span class="p">){</span>
  <span class="k">return</span> <span class="n">min</span><span class="p">(</span><span class="n">h2</span><span class="o">-</span><span class="n">h1</span><span class="p">,(</span><span class="kt">int</span><span class="p">)</span><span class="mf">1e6</span><span class="o">-</span><span class="n">h2</span><span class="o">+</span><span class="n">h1</span><span class="p">);</span>
<span class="p">}</span>

<span class="cm">/* Places a hydrant hose_len units away from the current house. 
 * For all houses in front of the current house, if their 
 * distance from the current house is * less than or equal to
 *  2*hose_len meaning they are either on the left side of the 
 * hydrant (placed hose_len units ahead of the current house) or on the 
 * right side of the hydrant (hence the extra hose_len) then they 
 * are marked as visisted.
 */</span>
<span class="kt">bool</span> <span class="n">predicate</span><span class="p">(</span><span class="kt">int</span> <span class="n">hose_len</span><span class="p">,</span><span class="kt">int</span> <span class="n">k_left</span> <span class="o">=</span> <span class="n">K</span><span class="p">,</span><span class="kt">int</span> <span class="n">h_left</span> <span class="o">=</span> <span class="n">H</span><span class="p">){</span>
  <span class="n">memset</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="nb">false</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">v</span><span class="p">));</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">house</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="n">h_left</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">k_left</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
      <span class="k">if</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
        <span class="k">continue</span><span class="p">;</span>
      <span class="k">else</span><span class="p">{</span>
        <span class="n">k_left</span><span class="o">--</span><span class="p">,</span><span class="n">h_left</span><span class="o">--</span><span class="p">,</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">H</span><span class="p">;</span><span class="n">k</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">house</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="o">++</span><span class="n">k</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">dist</span><span class="p">(</span><span class="n">house</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">house</span><span class="p">[</span><span class="n">k</span><span class="p">])</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="o">*</span><span class="n">hose_len</span><span class="p">)</span>
                <span class="n">h_left</span><span class="o">--</span><span class="p">,</span><span class="n">v</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
            <span class="k">else</span>
                <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
      <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">h_left</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="nb">true</span><span class="o">:</span><span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">H</span><span class="p">);</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">H</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
      <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">j</span><span class="p">);</span>
      <span class="n">house</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">house</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="n">house</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">K</span><span class="p">);</span>
    <span class="n">lo</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">hi</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="mf">1e6</span><span class="p">,</span><span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">lo</span> <span class="o">&lt;</span> <span class="n">hi</span><span class="p">){</span>
        <span class="c1">// this hose length works so it's now the upper bound</span>
        <span class="k">if</span><span class="p">(</span><span class="n">predicate</span><span class="p">(</span><span class="n">mid</span><span class="p">))</span>
            <span class="n">hi</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
        <span class="c1">// this hose length is too short</span>
        <span class="k">else</span>              
            <span class="n">lo</span> <span class="o">=</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
        <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">mid</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s4---animal-farm">Solution for <a href="http://wcipeg.com/problem/ccc10s4">CCC10S4 - Animal Farm</a></h1>

<p>This problem asks of us to find the minimum spanning tree of the graph where the pens are considered the nodes. First we must construct the graph since we are not given the graph required; instead we are given the corners of the pens. This must be done carefully since we need to ensure that any edge that only connects two pens connects these two pens, and any edge connecting one is actually connected this pen with the outside (which is another node in the graph). It is also important to note that it is not always possible that the graph is connected to the outside node (implying the graph is not connected). This is why it will be relatively trivial to use Prim’s algorithm for finding the minimum spanning since Prim’s can detect if a graph is connected or not automatically. Unlike Kruskal’s Algorithm which requires some more legwork (left as an exercise for the reader).</p>

<p>In the provided implementation we the time complexity for constructing the graph is \(O(N^2)\) where \(N\) is the number of pens, and the time complexity for finding the minimum spanning tree is \(O(N^2\log{}N)\).</p>

<p>Time Complexity: \(O(N^2\log{}N)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">corners</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">w</span><span class="p">,</span><span class="n">pen1</span><span class="p">,</span><span class="n">pen2</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">500</span><span class="p">,</span><span class="n">INF</span> <span class="o">=</span> <span class="mh">0x3F3F3F3F</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">E</span><span class="p">;</span>

<span class="n">corners</span> <span class="n">c</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">v</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">prim</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
    <span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;&gt;&gt;</span><span class="n">pq</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">MSTNodes</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">totWeight</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">adj</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">adj</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">){</span>
            <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="n">adj</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">,</span><span class="n">mp</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">adj</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">)));</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="nb">false</span><span class="p">,</span><span class="k">sizeof</span> <span class="n">v</span><span class="p">);</span>
    <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">MSTNodes</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="kt">int</span> <span class="n">w</span> <span class="o">=</span> <span class="o">-</span><span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">sn</span> <span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">y</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">en</span> <span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">y</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
        <span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">if</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="n">sn</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">v</span><span class="p">[</span><span class="n">en</span><span class="p">]){</span>
            <span class="n">MSTNodes</span><span class="o">++</span><span class="p">;</span>
            <span class="n">totWeight</span><span class="o">+=</span><span class="n">w</span><span class="p">;</span>
            <span class="n">v</span><span class="p">[</span><span class="n">en</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">adj</span><span class="p">[</span><span class="n">en</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">adj</span><span class="p">[</span><span class="n">en</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">){</span>
                    <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="n">adj</span><span class="p">[</span><span class="n">en</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">,</span><span class="n">mp</span><span class="p">(</span><span class="n">en</span><span class="p">,</span><span class="n">adj</span><span class="p">[</span><span class="n">en</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">)));</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">MSTNodes</span> <span class="o">==</span> <span class="n">n</span> <span class="o">?</span> <span class="n">totWeight</span><span class="o">:</span><span class="n">INF</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">w</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen2</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">E</span><span class="p">);</span>
        <span class="kt">int</span> <span class="n">tc</span><span class="p">[</span><span class="n">E</span><span class="p">],</span><span class="n">w</span><span class="p">[</span><span class="n">E</span><span class="p">];</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">E</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
            <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">tc</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">E</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
            <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">w</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">E</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="kt">int</span> <span class="n">corner</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">tc</span><span class="p">[</span><span class="n">j</span><span class="p">],</span><span class="n">tc</span><span class="p">[(</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">E</span><span class="p">]};</span>
            <span class="n">sort</span><span class="p">(</span><span class="n">corner</span><span class="p">,</span><span class="n">corner</span><span class="o">+</span><span class="mi">2</span><span class="p">);</span>
            <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">corner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="n">corner</span><span class="p">[</span><span class="mi">1</span><span class="p">]].</span><span class="n">pen1</span> <span class="o">==</span> <span class="n">INF</span><span class="p">)</span>
                <span class="n">c</span><span class="p">[</span><span class="n">corner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="n">corner</span><span class="p">[</span><span class="mi">1</span><span class="p">]].</span><span class="n">pen1</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="k">else</span>
                <span class="n">c</span><span class="p">[</span><span class="n">corner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="n">corner</span><span class="p">[</span><span class="mi">1</span><span class="p">]].</span><span class="n">pen2</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="n">c</span><span class="p">[</span><span class="n">corner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="n">corner</span><span class="p">[</span><span class="mi">1</span><span class="p">]].</span><span class="n">w</span> <span class="o">=</span> <span class="n">w</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="c1">// not connected to outside because declared twice</span>
            <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span> <span class="o">!=</span> <span class="n">INF</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen2</span> <span class="o">!=</span> <span class="n">INF</span><span class="p">){</span>
                <span class="n">adj</span><span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen2</span><span class="p">,</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">w</span><span class="p">));</span>
                <span class="n">adj</span><span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen2</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span><span class="p">,</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">w</span><span class="p">));</span>
            <span class="p">}</span>
            <span class="c1">// connected to outside because declared once</span>
            <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span> <span class="o">!=</span> <span class="n">INF</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen2</span> <span class="o">==</span> <span class="n">INF</span><span class="p">){</span>
                <span class="n">adj</span><span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">w</span><span class="p">));</span>
                <span class="n">adj</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">pen1</span><span class="p">,</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">].</span><span class="n">w</span><span class="p">));</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">ans1</span> <span class="o">=</span> <span class="n">prim</span><span class="p">(</span><span class="n">N</span><span class="p">),</span><span class="n">ans2</span> <span class="o">=</span> <span class="n">prim</span><span class="p">(</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">min</span><span class="p">(</span><span class="n">ans1</span><span class="p">,</span><span class="n">ans2</span><span class="p">));</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s2p1---barking-dogs">Solution for <a href="http://wcipeg.com/problem/ccc10s2p1">CCC10S2P1 - Barking Dogs</a></h1>

<p>This problem asks us to keep track events that come from \(D\) dogs, over a time interval \(T\). Then we must simulate the problem as specified in the statement. One has to be very careful with how they implement this because this problem is very easy to misinterpret or make silly mistakes.</p>

<p>Time complexity: \(O(TD)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="code"><pre><span class="n">nclude</span><span class="o">&lt;</span><span class="n">bits</span><span class="o">/</span><span class="n">stdc</span><span class="o">++</span><span class="p">.</span><span class="n">h</span><span class="o">&gt;</span>
<span class="cp">#define pb push_back
#define mp make_pair
#define db 1
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXD</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">SLEEPING</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">WAITING</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span><span class="n">BARKING</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">D</span><span class="p">,</span><span class="n">F</span><span class="p">,</span><span class="n">T</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">state</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">wait</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">timer</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">cnt</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">v</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>

<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXD</span><span class="p">];</span>

<span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">dog</span><span class="p">){</span>
   <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">dog</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="k">if</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">dog</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span> <span class="o">==</span> <span class="n">SLEEPING</span><span class="p">){</span>
          <span class="n">state</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">dog</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">WAITING</span><span class="p">;</span>
          <span class="n">timer</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">dog</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">wait</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">dog</span><span class="p">][</span><span class="n">i</span><span class="p">]];</span>
       <span class="p">}</span>
   <span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">D</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">D</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">wait</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">F</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">F</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">b</span><span class="p">;</span>
       <span class="n">adj</span><span class="p">[</span><span class="o">--</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="o">--</span><span class="n">b</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="n">SLEEPING</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">state</span><span class="p">));</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">timer</span><span class="p">,</span><span class="n">SLEEPING</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">timer</span><span class="p">));</span>
    <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">BARKING</span><span class="p">;</span>
    <span class="n">timer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">t</span> <span class="o">&lt;=</span> <span class="n">T</span><span class="p">;</span><span class="n">t</span><span class="o">++</span><span class="p">){</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">dog</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">dog</span> <span class="o">&lt;</span> <span class="n">D</span><span class="p">;</span><span class="n">dog</span><span class="o">++</span><span class="p">){</span>
           <span class="k">if</span><span class="p">(</span><span class="n">timer</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
              <span class="n">cnt</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
              <span class="n">update</span><span class="p">(</span><span class="n">dog</span><span class="p">);</span>
           <span class="p">}</span>
       <span class="p">}</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">dog</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">dog</span> <span class="o">&lt;</span> <span class="n">D</span><span class="p">;</span><span class="n">dog</span><span class="o">++</span><span class="p">){</span>
           <span class="n">timer</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span><span class="o">--</span><span class="p">;</span>
           <span class="k">if</span><span class="p">(</span><span class="n">timer</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span><span class="n">state</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">=</span> <span class="n">BARKING</span><span class="p">;</span>
           <span class="k">if</span><span class="p">(</span><span class="n">timer</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">&lt;</span>  <span class="mi">0</span><span class="p">)</span><span class="n">state</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">=</span> <span class="n">SLEEPING</span><span class="p">;</span>
           <span class="k">if</span><span class="p">(</span><span class="n">timer</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">&gt;</span>  <span class="mi">0</span><span class="p">)</span><span class="n">state</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">=</span> <span class="n">WAITING</span><span class="p">;</span>
       <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">dog</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">dog</span> <span class="o">&lt;</span> <span class="n">D</span><span class="p">;</span><span class="n">dog</span><span class="o">++</span><span class="p">)</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">cnt</span><span class="p">[</span><span class="n">dog</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s2p3---wowow">Solution for <a href="http://wcipeg.com/problem/ccc10s2p3">CCC10S2P3 - Wowow</a></h1>

<p>This problem asks us to handle a ranking system where we have to update a person’s score and query for the Kth ranked person.</p>

<p>Although this problem was intended to be solved with an offline solution that incorporates a binary indexed tree, today I will go over the solution which uses an order statistic tree. An order statistic tree is special tree that has the same characteristics of a binary search tree, but with the added functionality of being able to query for the Kth ranked element in the tree. The main idea for handling ranked based queries on an ordered statistic tree is to at every node to keep the number of children in its left and right sub-tree. Then when we search through an element every time we go left in the sub-tree we add the value of the current node’s right sub-tree – since the number of elements in the right sub-tree are the number of elements that are larger than the queried element.</p>

<p>In addition to this we also are required to keep the tree balanced otherwise the tree degenerates into a linked list where the time per query is \(O(N)\) resulting in an overall complexity of \(O(QN)\) instead of \(O(Qlog{}N)\). Luckily the built in Ordered Statistics Tree uses a red black tree for its implementation.</p>

<p>Time Complexity: \(O(Q\log{}N)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;ext/pb_ds/assoc_container.hpp&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;ext/pb_ds/tree_policy.hpp&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">__gnu_pbds</span><span class="p">;</span>

<span class="k">typedef</span> <span class="n">tree</span><span class="o">&lt;</span>
  <span class="kt">int</span><span class="p">,</span>
  <span class="n">null_type</span><span class="p">,</span>
  <span class="n">greater</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">,</span>
  <span class="n">rb_tree_tag</span><span class="p">,</span>
  <span class="n">tree_order_statistics_node_update</span><span class="o">&gt;</span>
<span class="n">set_t</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">X</span><span class="p">,</span><span class="n">R</span><span class="p">,</span><span class="n">K</span><span class="p">,</span><span class="n">n</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">cmd</span><span class="p">;</span>
<span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">user</span><span class="p">,</span><span class="n">score</span><span class="p">;</span>
<span class="n">set_t</span> <span class="n">s</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
      <span class="n">scanf</span><span class="p">(</span><span class="s">" %c"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">cmd</span><span class="p">);</span>
      <span class="k">if</span><span class="p">(</span><span class="n">cmd</span> <span class="o">==</span> <span class="sc">'N'</span><span class="p">){</span>
        <span class="n">scan</span><span class="p">(</span><span class="n">X</span><span class="p">);</span>
        <span class="n">scan</span><span class="p">(</span><span class="n">R</span><span class="p">);</span>
        <span class="n">user</span><span class="p">[</span><span class="n">X</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">;</span>
        <span class="n">score</span><span class="p">[</span><span class="n">R</span><span class="p">]</span> <span class="o">=</span> <span class="n">X</span><span class="p">;</span>
        <span class="n">s</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">R</span><span class="p">);</span>
      <span class="p">}</span>
      <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">cmd</span> <span class="o">==</span> <span class="sc">'M'</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="n">X</span><span class="p">,</span><span class="n">R</span><span class="p">);</span>
        <span class="n">s</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">user</span><span class="p">[</span><span class="n">X</span><span class="p">]);</span>
        <span class="n">score</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">user</span><span class="p">[</span><span class="n">X</span><span class="p">]);</span>
        <span class="n">user</span><span class="p">[</span><span class="n">X</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">;</span>
        <span class="n">score</span><span class="p">[</span><span class="n">R</span><span class="p">]</span> <span class="o">=</span> <span class="n">X</span><span class="p">;</span>
        <span class="n">s</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">R</span><span class="p">);</span>
      <span class="p">}</span><span class="k">else</span><span class="p">{</span>
        <span class="n">scan</span><span class="p">(</span><span class="n">K</span><span class="p">);</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">score</span><span class="p">[</span><span class="o">*</span><span class="n">s</span><span class="p">.</span><span class="n">find_by_order</span><span class="p">(</span><span class="n">K</span><span class="o">-</span><span class="mi">1</span><span class="p">)]);</span>
      <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s2p2---tree-pruning">Solution for <a href="http://wcipeg.com/problem/ccc10s2p2">CCC10S2P2 - Tree Pruning</a></h1>

<p>This problem asks us to find the minimum amount of prunes - or sub-trees needed to be removed- to make the difference between the black and white nodes in a tree to be exactly a value D. In-order to accomplish this we must use dynamic programming.</p>

<p>First we must define our dynamic state. In this solution we define the first dimension of our DP array to be the nodes, and the second dimension to be the difference between the black and white nodes in this sub tree, and the value of this index is the minimum amount of prunes required to reach this state.</p>

\[DP[node][B-W] = \text{minimum number of prunes}\]

<p>In-order to fill this DP array we must traverse through the tree and progressively fill the DP array. There are serveral cases that need to be considered when doing this.</p>

<p><strong>Case 0:</strong>
No prunes are done on this sub tree, so</p>

\[DP[node][\text{left subtree+right subtree+node}] = 0\]

<p><strong>Case 1:</strong>
One prune is required to make this whole sub-tree equal to 0, so</p>

\[DP[node][0] = 1\]

<p><strong>Case 2:</strong>
If the current node only has one child then the difference for this subtree are the possible diffrence for this subtree’s one child minus itself so,</p>

\[DP[node][i+type[node]] = min(itself, DP[child][i])\]

<p><strong>Case 3:</strong>
If the current node has two children the the differences for this subtree are possible differences in its left subtree plus the differences in its right subtree.</p>

\[DP[node][i+j+type[node]] = min(itself, DP[child1][i]+DP[child2][j])\]

<p>Time Complexity : \(O(N)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x) (x).begin(),(x).end()
#define f(x) (x)+300
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">,</span><span class="n">inf</span> <span class="o">=</span> <span class="mh">0x3f3f3f3f</span><span class="p">,</span><span class="n">B</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">W</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">D</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">type</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>


<span class="kt">int</span> <span class="nf">F</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">){</span>
    <span class="k">return</span> <span class="n">x</span><span class="o">+</span><span class="mi">350</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
	<span class="c1">// left subtree, right subtree</span>
    <span class="kt">int</span> <span class="n">tree</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">};</span>
    <span class="kt">int</span> <span class="n">children</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">].</span><span class="n">size</span><span class="p">();</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">children</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">tree</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dfs</span><span class="p">(</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span>
    <span class="p">}</span>
	<span class="c1">// the normal tree requires 0 prunes</span>
    <span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">tree</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">])]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="c1">// pruning the entire subtree requires 1 prune</span>
    <span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="mi">0</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">children</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
        <span class="c1">// dp[n][i+type[n]] = minimum of itself and the dp[child][i]</span>
        <span class="c1">// for example dp[0][-300+1] = min(dp[0][-300+1],dp[1][-300])</span>
        <span class="c1">// this is because -300+1 = 299</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">300</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">300</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">])]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">])],</span>
                                      <span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="p">)]);</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">children</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
        <span class="c1">// dp[n][i+type[n]] = min(itself, it's to children which add up to i)</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">300</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">300</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="o">-</span><span class="mi">300</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;=</span> <span class="mi">300</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="c1">// if it's impossible for any branch to reach a sum (i or j)</span>
                <span class="c1">// then it's impossible to make i+j</span>
               <span class="k">if</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span> <span class="o">!=</span> <span class="n">inf</span> <span class="o">&amp;&amp;</span> <span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]][</span><span class="n">F</span><span class="p">(</span><span class="n">j</span><span class="p">)]</span> <span class="o">!=</span> <span class="n">inf</span><span class="p">){</span>
                  <span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">])]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">])],</span>
                                              <span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="n">F</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span>
                                              <span class="o">+</span> <span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]][</span><span class="n">F</span><span class="p">(</span><span class="n">j</span><span class="p">)]);</span>
			   <span class="p">}</span>
			<span class="p">}</span>
		<span class="p">}</span>
    <span class="p">}</span>
	<span class="c1">// return the left subtree,right subtree, and itself</span>
    <span class="k">return</span> <span class="n">tree</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">tree</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">type</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">,</span><span class="o">&amp;</span><span class="n">D</span><span class="p">);</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">dp</span><span class="p">,</span><span class="n">inf</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">dp</span><span class="p">));</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">id</span><span class="p">,</span><span class="n">cl</span><span class="p">,</span><span class="n">ch</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">id</span><span class="p">,</span><span class="o">&amp;</span><span class="n">cl</span><span class="p">,</span><span class="o">&amp;</span><span class="n">ch</span><span class="p">);</span>
        <span class="n">type</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">cl</span> <span class="o">==</span> <span class="n">W</span><span class="p">)</span> <span class="o">?</span> <span class="mi">1</span><span class="o">:-</span><span class="mi">1</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">nd</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="n">ch</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">nd</span><span class="p">);</span>
            <span class="n">adj</span><span class="p">[</span><span class="n">id</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">nd</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">dfs</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">D</span><span class="p">)]</span> <span class="o">&gt;=</span> <span class="n">inf</span><span class="p">)</span>
       <span class="n">printf</span><span class="p">(</span><span class="s">"-1</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">else</span>
       <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">dp</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">F</span><span class="p">(</span><span class="n">D</span><span class="p">)]);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s2p4---computer-purchase-return">Solution for <a href="http://wcipeg.com/problem/ccc10s2p4">CCC10S2P4 - Computer Purchase Return</a></h1>

<p>This problem asks us to build the best computer from a random assortments under a restriced budget. 
To solve this we must use Dynamic Programming, so the begin we should define our dynamic state.
In this case it will be:</p>

\[DP[budget][\text{item number}]\]

<p>Now we iterate over all of the possible combinations and store it in our DP state. However it is important to noitce that \(DP[\text{i+cost}][j]\) is only possible if if the previous element \(DP[i][j-1]\) is possible.</p>

<p>Time Complexity: \(O(TB)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXT</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span><span class="n">MAXB</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">T</span><span class="p">,</span><span class="n">N</span><span class="p">,</span><span class="n">B</span><span class="p">,</span><span class="n">best</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAXB</span><span class="p">][</span><span class="n">MAXT</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXT</span><span class="p">];</span><span class="c1">// cost,value</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
   <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">T</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">);</span>
   <span class="n">memset</span><span class="p">(</span><span class="n">dp</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">dp</span><span class="p">));</span>
   <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">c</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">t</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
       <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">c</span><span class="p">,</span><span class="o">&amp;</span><span class="n">v</span><span class="p">,</span><span class="o">&amp;</span><span class="n">t</span><span class="p">);</span><span class="n">t</span><span class="o">--</span><span class="p">;</span>
       <span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">v</span><span class="p">));</span>
   <span class="p">}</span>
   <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">B</span><span class="p">);</span>
   <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span><span class="n">adj</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">);</span>
   <span class="p">}</span>
   <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><span class="n">t</span> <span class="o">&lt;</span> <span class="n">T</span><span class="p">;</span><span class="n">t</span><span class="o">++</span><span class="p">){</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
           <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;=</span> <span class="n">B</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
               <span class="k">if</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">t</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">){</span>
                  <span class="n">dp</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="n">t</span><span class="p">],</span>
                                             <span class="n">dp</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">t</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">);</span>
               <span class="p">}</span>
           <span class="p">}</span>
       <span class="p">}</span>
   <span class="p">}</span>
   <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">B</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="n">best</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">best</span><span class="p">,</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">T</span><span class="o">-</span><span class="mi">1</span><span class="p">]);</span>
   <span class="p">}</span>
   <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">best</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span><span class="o">:</span><span class="n">best</span><span class="p">);</span>
   <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc10s2p5---space-miner">Solution for <a href="http://wcipeg.com/problem/ccc10s2p5">CCC10S2P5 - Space Miner</a></h1>

<p>This problem asks us to follow a jagged path created by connecting \(N\) points a space ship visits (in sequential order) and to check through our  \(M\) planets, denoted \(M_i\), to see if they are within \(D+r_i\) units from any line segment on this path. In-order to solve this we have to use 3D vector mathematics to define each line segment on the path, and a line segment for each planet respective to the path. Then for each segment we should consider the three possible orientations any planet can appear in relative to the path.</p>

<p><strong>Orientation 1:</strong>
<img style="float: right;" width="80" height="80" src="/images/orentiation1.jpg" />
The planet does not fall within the boundaries of the line segment, and its vector projection onto the line segment is opposite to the line segment’s direction, and it’s to the left. In this case the distance is just equal ot the magnitude of the vector formed from the beginning of the line segment to the planet.</p>

<p><strong>Orientation 2:</strong>
<img style="float: right;" width="80" height="80" src="/images/orentiation2.jpg" />
This planet does not fall within the boundaries of the line segment, and its vector projection onto the line segment is opposite to the line segment’s direction, and it’s to the right. In this case the distance is just equal to the magnitude of the vector formed from the end of the line segment ot the planet.</p>

<p><strong>Orientation 3:</strong>
<img style="float: right;" width="80" height="80" src="/images/orentiation3.jpg" />
The planet does fall within the boundaries of the line segment, so its distance is equal to the area of the parallelogram made from the cross product of the line segment and the vector towards the planet divided by the magnitude of the line segment (the base). In the following equation the vector \(S\) is the line segment on the path, and \(P\) is the vector formed the line segment to the planet \(P\).</p>

\[d=\frac{|S*P|}{|S|}\]

<p>Time Complexity: \(O(MN)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">vector3D</span><span class="p">{</span>
     <span class="kt">double</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">;</span>
     <span class="n">vector3D</span><span class="p">(){</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">y</span> <span class="o">=</span> <span class="n">z</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
     <span class="p">}</span>
     <span class="n">vector3D</span><span class="p">(</span><span class="kt">double</span> <span class="n">_x</span><span class="p">,</span><span class="kt">double</span> <span class="n">_y</span><span class="p">,</span><span class="kt">double</span> <span class="n">_z</span><span class="p">){</span>
          <span class="n">x</span> <span class="o">=</span> <span class="n">_x</span><span class="p">,</span><span class="n">y</span> <span class="o">=</span> <span class="n">_y</span><span class="p">,</span><span class="n">z</span> <span class="o">=</span> <span class="n">_z</span><span class="p">;</span>
     <span class="p">}</span>
     <span class="c1">// misceallanous</span>
     <span class="kt">double</span> <span class="n">magnitude</span><span class="p">(){</span>
        <span class="k">return</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="o">*</span><span class="n">y</span><span class="o">+</span><span class="n">z</span><span class="o">*</span><span class="n">z</span><span class="p">);</span>
     <span class="p">}</span>
     <span class="n">vector3D</span> <span class="n">unit_vector</span><span class="p">(){</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">x</span><span class="o">/</span><span class="k">this</span><span class="o">-&gt;</span><span class="n">magnitude</span><span class="p">(),</span><span class="n">y</span><span class="o">/</span><span class="k">this</span><span class="o">-&gt;</span><span class="n">magnitude</span><span class="p">(),</span>
                          <span class="n">z</span><span class="o">/</span><span class="k">this</span><span class="o">-&gt;</span><span class="n">magnitude</span><span class="p">()};</span>
     <span class="p">}</span>
     <span class="c1">// operators</span>
     <span class="kt">void</span> <span class="k">operator</span> <span class="o">=</span> <span class="p">(</span><span class="k">const</span> <span class="n">vector3D</span><span class="o">&amp;</span><span class="n">v</span><span class="p">){</span>
          <span class="n">x</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
          <span class="n">y</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
          <span class="n">z</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
     <span class="p">}</span>
     <span class="c1">// vector addition</span>
     <span class="n">vector3D</span> <span class="k">operator</span> <span class="o">+</span> <span class="p">(</span><span class="k">const</span> <span class="n">vector3D</span><span class="o">&amp;</span><span class="n">v</span><span class="p">){</span> 
         <span class="k">return</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">x</span><span class="o">+</span><span class="n">v</span><span class="p">.</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="o">+</span><span class="n">v</span><span class="p">.</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="o">+</span><span class="n">v</span><span class="p">.</span><span class="n">z</span><span class="p">};</span>
     <span class="p">}</span>
     <span class="c1">//vector subtraction</span>
     <span class="n">vector3D</span> <span class="k">operator</span> <span class="o">-</span> <span class="p">(</span><span class="k">const</span> <span class="n">vector3D</span><span class="o">&amp;</span><span class="n">v</span><span class="p">){</span>
         <span class="k">return</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">x</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">z</span><span class="p">};</span>
     <span class="p">}</span>
     <span class="cp"># vector multiplication
</span>     <span class="n">vector3D</span> <span class="k">operator</span> <span class="o">*</span> <span class="p">(</span><span class="k">const</span> <span class="n">vector3D</span><span class="o">&amp;</span><span class="n">v</span><span class="p">){</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">y</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">z</span> <span class="o">-</span> <span class="n">z</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">x</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">z</span><span class="p">,</span> <span class="n">x</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">y</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">x</span><span class="p">};</span>
     <span class="p">}</span>
     <span class="c1">// dot product</span>
     <span class="kt">double</span> <span class="k">operator</span> <span class="o">^</span> <span class="p">(</span><span class="k">const</span> <span class="n">vector3D</span><span class="o">&amp;</span><span class="n">v</span><span class="p">){</span>
          <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">z</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
     <span class="p">}</span>

<span class="p">};</span>

<span class="k">struct</span> <span class="nc">planet</span><span class="p">{</span>
   <span class="kt">int</span> <span class="n">v</span><span class="p">,</span><span class="n">r</span><span class="p">;</span>
   <span class="n">vector3D</span> <span class="n">p</span><span class="p">;</span>
   <span class="n">planet</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span><span class="kt">double</span> <span class="n">y</span><span class="p">,</span> <span class="kt">double</span> <span class="n">z</span><span class="p">,</span><span class="kt">int</span> <span class="n">_v</span><span class="p">,</span><span class="kt">int</span> <span class="n">_r</span><span class="p">){</span>
      <span class="n">v</span> <span class="o">=</span> <span class="n">_v</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">_r</span><span class="p">;</span>
      <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">};</span>
   <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">gate</span><span class="p">{</span>
  <span class="n">vector3D</span> <span class="n">p</span><span class="p">;</span>
  <span class="n">gate</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span><span class="kt">double</span> <span class="n">y</span><span class="p">,</span> <span class="kt">double</span> <span class="n">z</span><span class="p">){</span>
     <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">vector3D</span><span class="p">){</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">};</span>
  <span class="p">}</span>
<span class="p">};</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXM</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">M</span><span class="p">,</span><span class="n">N</span><span class="p">,</span><span class="n">D</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">vis</span><span class="p">[</span><span class="n">MAXM</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">planet</span><span class="o">&gt;</span><span class="n">planets</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">gate</span><span class="o">&gt;</span><span class="n">gates</span><span class="p">;</span>

<span class="kt">bool</span> <span class="n">within_range</span><span class="p">(</span><span class="n">gate</span> <span class="n">one</span><span class="p">,</span><span class="n">gate</span> <span class="n">two</span><span class="p">,</span><span class="n">planet</span> <span class="n">pt</span><span class="p">){</span>
    <span class="n">vector3D</span> <span class="n">v0</span> <span class="o">=</span> <span class="n">two</span><span class="p">.</span><span class="n">p</span><span class="o">-</span><span class="n">one</span><span class="p">.</span><span class="n">p</span><span class="p">;</span>
    <span class="n">vector3D</span> <span class="n">v1</span> <span class="o">=</span> <span class="n">pt</span><span class="p">.</span><span class="n">p</span><span class="o">-</span><span class="n">one</span><span class="p">.</span><span class="n">p</span><span class="p">;</span>
    <span class="n">vector3D</span> <span class="n">v2</span> <span class="o">=</span> <span class="n">pt</span><span class="p">.</span><span class="n">p</span><span class="o">-</span><span class="n">two</span><span class="p">.</span><span class="n">p</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="n">v1</span> <span class="o">^</span> <span class="n">v0</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
       <span class="c1">// the projection of the vector lies outside the line segment</span>
       <span class="c1">// and counter clockwise to the line segment. So we just take</span>
       <span class="c1">// the magnitude of v1</span>
       <span class="k">if</span><span class="p">(</span><span class="n">v1</span><span class="p">.</span><span class="n">magnitude</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">pt</span><span class="p">.</span><span class="n">r</span><span class="o">+</span><span class="n">D</span> <span class="p">)</span>
          <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
       <span class="k">else</span>
          <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="n">v2</span><span class="o">^</span><span class="n">v0</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
       <span class="c1">// the projection of the vector lies outside the line segment</span>
       <span class="c1">// and lockwise to the line segment. So we just take</span>
       <span class="c1">// the magnitude of v2</span>
       <span class="k">if</span><span class="p">(</span><span class="n">v2</span><span class="p">.</span><span class="n">magnitude</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">pt</span><span class="p">.</span><span class="n">r</span><span class="o">+</span><span class="n">D</span><span class="p">)</span>
          <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
       <span class="k">else</span>
         <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="c1">// the point is within the boundaries of the vector so we take the </span>
    <span class="c1">// cross product of v0 and v1 to get the area of the parrelogram then</span>
    <span class="c1">// we divide it by its base to get the height. Which in this case is </span>
    <span class="c1">// the distance from the line</span>
    <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="n">v0</span><span class="o">*</span><span class="n">v1</span><span class="p">).</span><span class="n">magnitude</span><span class="p">()</span><span class="o">/</span><span class="n">v0</span><span class="p">.</span><span class="n">magnitude</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">pt</span><span class="p">.</span><span class="n">r</span><span class="o">+</span><span class="n">D</span> <span class="p">)</span>
        <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>

    <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">M</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">M</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="kt">double</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">v</span><span class="p">,</span><span class="n">r</span><span class="p">;</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x</span> <span class="o">&gt;&gt;</span> <span class="n">y</span> <span class="o">&gt;&gt;</span> <span class="n">z</span> <span class="o">&gt;&gt;</span> <span class="n">v</span> <span class="o">&gt;&gt;</span> <span class="n">r</span><span class="p">;</span>
        <span class="n">planets</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">planet</span><span class="p">){</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">r</span><span class="p">});</span>
    <span class="p">}</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="kt">double</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">;</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x</span> <span class="o">&gt;&gt;</span> <span class="n">y</span> <span class="o">&gt;&gt;</span> <span class="n">z</span><span class="p">;</span>
        <span class="n">gates</span><span class="p">.</span><span class="n">pb</span><span class="p">((</span><span class="n">gate</span><span class="p">){</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">});</span>
    <span class="p">}</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">D</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">gates</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="n">M</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">vis</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">within_range</span><span class="p">(</span><span class="n">gates</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">gates</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span><span class="n">planets</span><span class="p">[</span><span class="n">j</span><span class="p">])){</span>
                <span class="n">vis</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
                <span class="n">cnt</span> <span class="o">+=</span> <span class="n">planets</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">v</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">cnt</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc11s3---alice-through-the-looking-glass">Solution for <a href="http://wcipeg.com/problem/ccc11s3">CCC11S3 - Alice Through the Looking Glass</a></h1>

<p>This problem asks us to whether or not, given an ordered pair \((x,y)\) and a recursive depth level \(M\), if the crystal at this location will be present; meaning it will not be cut off at any point due to the recursive method we generate the crystal. When we do generate this recursively we have to take into consideration the base cases.</p>

<h2 id="base-cases">Base Cases</h2>

<p>By inspection we notice that if \((x,y)\) lies in any part of the crystal the following inequalities must hold:</p>
<center>$$5^{M-1} &lt; x &lt; 5^{M} \,\land\, 0 &lt; y &lt;= 3 \cdot 5^{M-1}$$</center>

<p>Then we note that if \((x,y)\)  lies in the left most part of the crystal then the following must hold :</p>
<center>$$5^{M-1} &lt; x &lt; 5^{M} \,\land\, 0 &lt; y &lt;= 5^{M-1}$$</center>

<p>if \((x,y)\)  lies in the right most part of the crystal then the following must hold:</p>
<center>$$3\cdot5^{M-1} &lt;= x &lt; 5^{M} \,\land\, 0 &lt; y &lt;= 5^{M-1}$$</center>

<h2 id="recursive-case">Recursive Case</h2>
<p>If the current point does lie in the crystal then it must lie within coordinates:</p>
<center>$$(x \mod 5^{M-1}, y \mod 5^{M-1})$$</center>

<p>Time complexity: \(O(M)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">m</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">;</span>

<span class="kt">bool</span> <span class="nf">cryst</span><span class="p">(</span><span class="kt">int</span> <span class="n">m</span><span class="p">,</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span><span class="kt">int</span> <span class="n">y</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">m</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
        <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">){</span>
        <span class="c1">//left</span>
        <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>  <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)){</span>
            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//right</span>
        <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)){</span>
            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//middle</span>
        <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="o">*</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)){</span>
            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cryst</span><span class="p">(</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">x</span><span class="o">%</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span><span class="n">y</span><span class="o">%</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">pow</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">))){</span>
            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">m</span> <span class="o">&gt;&gt;</span> <span class="n">x</span> <span class="o">&gt;&gt;</span> <span class="n">y</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cryst</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">y</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span>
            <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"crystal"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
        <span class="k">else</span>
            <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"empty"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc11s5---switch">Solution for <a href="http://wcipeg.com/problem/ccc11s5">CCC11S5 - Switch</a></h1>

<p>This problem asks us to find the minimum amount of light switches required to make a grid of size \(N\), into a grid of turned off lights. Because the bounds on \(N\) are relatively small we can represent each light as a bit in an integer using bitmasks. Now that we can easily represent our state all we must do is execute a breadth first search until we find a grid of turned of lights.</p>

<p>Time Complexity: \(O(2^N)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">ID</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">C</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">v</span><span class="p">[(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">25</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// maximum number of states we have to reach</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">" %c"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">C</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">C</span> <span class="o">==</span> <span class="sc">'1'</span><span class="p">)</span>
           <span class="n">ID</span> <span class="o">|=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">queue</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">q</span><span class="p">;</span>
    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">ID</span><span class="p">));</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">id</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">y</span><span class="p">;</span>
        <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">){</span>
                <span class="cm">/*Checks for 4 consecutive ones.*/</span>
                <span class="k">if</span><span class="p">((</span><span class="n">id</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> 
                <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">id</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> 
                <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">id</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span>
                <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">id</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">){</span>
                     <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
                         <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="n">id</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
                            <span class="n">id</span> <span class="o">^=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
                         <span class="k">else</span>
                            <span class="k">break</span><span class="p">;</span>
                     <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">id</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">d</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">bit</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">bit</span> <span class="o">=</span> <span class="p">(</span><span class="n">id</span><span class="o">&gt;&gt;</span><span class="n">i</span><span class="p">)</span><span class="o">&amp;</span><span class="mi">1</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">bit</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">){</span>
                <span class="n">id</span> <span class="o">^=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
                <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="p">[</span><span class="n">id</span><span class="p">]){</span>
                    <span class="n">v</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
                    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">id</span><span class="p">));</span>
                <span class="p">}</span>
                <span class="n">id</span> <span class="o">^=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc11s2p2---vampire-tunnels">Solution for <a href="http://wcipeg.com/problem/ccc11s2p2">CCC11S2P2 - Vampire Tunnels</a></h1>

<p>We are given a weighted graph and our asked to find the minimum amount of time required to reach a node N. This problem requires the use of Dijkstras algorithm with a small change to the algorithm. Since we are given another restriction on the edge weights we add another dimension to our distance array so are distance array is now, and now we just run Dijkstras on this graph.</p>

<p>Time Complexity: \(O(N \cdot S \cdot \log(N \cdot S))\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x) (x).begin(),(x).end()
#define x first
#define y second
#define UG 0
#define OG 1
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>


<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">1601</span><span class="p">,</span> <span class="n">MAXSL</span> <span class="o">=</span> <span class="mi">3601</span><span class="p">,</span><span class="n">INF</span> <span class="o">=</span> <span class="mh">0x3F3F3F3F</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">S</span><span class="p">,</span><span class="n">N</span><span class="p">,</span><span class="n">E</span><span class="p">,</span><span class="n">ans</span> <span class="o">=</span> <span class="n">INF</span><span class="p">,</span><span class="n">tans</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span> <span class="c1">// city, distance, sunlight</span>
<span class="kt">int</span> <span class="n">dist</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXSL</span><span class="p">];</span>


<span class="kt">void</span> <span class="nf">dijkstra</span><span class="p">(){</span>
    <span class="n">priority_queue</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">pq</span><span class="p">;</span>
    <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">mp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)));</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="kt">int</span> <span class="n">d</span>  <span class="o">=</span>  <span class="o">-</span><span class="p">(</span><span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">x</span><span class="p">);</span>
        <span class="kt">int</span> <span class="n">sl</span> <span class="o">=</span>  <span class="o">-</span><span class="p">(</span><span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">y</span><span class="p">.</span><span class="n">x</span><span class="p">);</span>
        <span class="kt">int</span> <span class="n">n</span>  <span class="o">=</span>    <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">y</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
        <span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
            <span class="kt">int</span> <span class="n">nt</span> <span class="o">=</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">;</span>
            <span class="kt">int</span> <span class="n">w</span>  <span class="o">=</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
            <span class="kt">int</span> <span class="n">type</span> <span class="o">=</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="n">UG</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">d</span><span class="o">+</span><span class="n">w</span><span class="p">){</span>
                    <span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="o">+</span><span class="n">w</span><span class="p">;</span>
                    <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">],</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="n">sl</span><span class="p">,</span><span class="n">nt</span><span class="p">)));</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="n">OG</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">sl</span> <span class="o">+</span> <span class="n">w</span> <span class="o">&lt;=</span> <span class="n">S</span><span class="p">){</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">d</span><span class="o">+</span><span class="n">w</span><span class="p">){</span>
                        <span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="o">+</span><span class="n">w</span><span class="p">;</span>
                        <span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="n">dist</span><span class="p">[</span><span class="n">nt</span><span class="p">][</span><span class="n">sl</span><span class="p">],</span><span class="n">mp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">sl</span><span class="o">+</span><span class="n">w</span><span class="p">),</span><span class="n">nt</span><span class="p">)));</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">dist</span><span class="p">,</span><span class="n">INF</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">dist</span><span class="p">));</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">S</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">,</span><span class="o">&amp;</span><span class="n">E</span><span class="p">);</span><span class="n">N</span><span class="o">--</span><span class="p">,</span><span class="n">E</span><span class="o">--</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">s</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">E</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">s</span><span class="p">,</span><span class="o">&amp;</span><span class="n">t</span><span class="p">,</span><span class="o">&amp;</span><span class="n">d</span><span class="p">,</span><span class="o">&amp;</span><span class="n">u</span><span class="p">);</span>
        <span class="n">adj</span><span class="p">[</span><span class="n">s</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="n">mp</span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">)));</span>
        <span class="n">adj</span><span class="p">[</span><span class="n">t</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="n">mp</span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">)));</span>
    <span class="p">}</span>
    <span class="n">dijkstra</span><span class="p">();</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">S</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">)</span>
        <span class="n">ans</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">ans</span><span class="p">,</span><span class="n">dist</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span>
    <span class="k">if</span><span class="p">(</span><span class="n">ans</span> <span class="o">==</span> <span class="n">INF</span><span class="p">)</span>
        <span class="n">ans</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">ans</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc11s2p3---reorganization">Solution for <a href="http://wcipeg.com/problem/ccc11s2p3">CCC11S2P3 - Reorganization</a></h1>

<p>We are given a list of people and are asked whether or not it is possible to match an employee with a high rank with 0-2 employees with lower ranks. This can be accomplished by greedily matching an employee with an employee closest in rank, but which is still higher than its own rank. When there are no possible employees to match with then we simply print out “No”. Otherwise if the process is able to finish we print “Yes”.</p>

<p>Time Complexity: \(O(N \cdot \log(N))\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x) (x).begin(),(x).end()
#define x first
#define y second
#define nullptr 0
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>


<span class="kt">int</span> <span class="n">N</span><span class="p">;</span>
<span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">v</span><span class="p">;</span>
<span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">C</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">j</span><span class="p">;</span>
       <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
          <span class="n">v</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
       <span class="k">else</span><span class="p">{</span>
          <span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span> <span class="o">=</span> <span class="o">--</span><span class="n">v</span><span class="p">.</span><span class="n">upper_bound</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
          <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">j</span><span class="p">){</span>
             <span class="n">printf</span><span class="p">(</span><span class="s">"NO</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
             <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
          <span class="p">}</span>
          <span class="k">while</span><span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">()){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">C</span><span class="p">[</span><span class="o">*</span><span class="n">it</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">){</span>
               <span class="n">C</span><span class="p">[</span><span class="o">*</span><span class="n">it</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
               <span class="n">v</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
               <span class="k">if</span><span class="p">(</span><span class="n">C</span><span class="p">[</span><span class="o">*</span><span class="n">it</span><span class="p">]</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span>
                  <span class="n">v</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">it</span><span class="p">);</span>
               <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="o">--</span><span class="n">it</span><span class="p">;</span>
          <span class="p">}</span>
          <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">j</span><span class="p">)){</span>
             <span class="n">printf</span><span class="p">(</span><span class="s">"NO</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
             <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
          <span class="p">}</span>
       <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"YES</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc11s2p3---spies-like-us">Solution for <a href="http://wcipeg.com/problem/ccc11s2p3">CCC11S2P3 - Spies Like Us</a></h1>

<p>We are given a list of N people who wish to speak with each other, we then want to find whether a person shares more than one common contact with another person. This can be done by brute forcing the through all of the contact lists M and keeping track of how many common contacts people share.</p>

<p>Time Complexity: \(O(N^2 \cdot M)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x) (x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">2000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">M</span><span class="p">,</span><span class="n">K</span><span class="p">;</span>
<span class="kt">int</span>  <span class="n">cnt</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">mtx</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">,</span><span class="o">&amp;</span><span class="n">M</span><span class="p">,</span><span class="o">&amp;</span><span class="n">K</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">K</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span><span class="o">&amp;</span><span class="n">b</span><span class="p">);</span>
        <span class="n">adj</span><span class="p">[</span><span class="o">--</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="o">--</span><span class="n">b</span><span class="p">);</span>
        <span class="n">mtx</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">k</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">k</span><span class="o">++</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">!=</span><span class="n">k</span> <span class="o">&amp;&amp;</span> <span class="n">mtx</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">adj</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]]){</span>
                   <span class="n">cnt</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
                   <span class="k">if</span><span class="p">(</span><span class="n">cnt</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">){</span>
                      <span class="n">printf</span><span class="p">(</span><span class="s">"NO</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
                      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
                   <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"YES</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc12s4---a-coin-game">Solution for <a href="http://wcipeg.com/problem/ccc12s4">CCC12S4 - A Coin Game</a></h1>

<p>This problem asks us to keep track of a game and finding the minimum amount of moves required to make a certain grid into ascending order. This problem can be done by executing a breadth first search and using a set to represent the current game. From then one we keep on creating a grid until we reach our desired grid.</p>

<p>Time Complexity:</p>

<p>If we assume without loss of generality that we can place numbers on top of each other, without the restrictions, 
then we can reduce the sample space we are searching to the number of combinations in the <a href="https://cp-algorithms.com/combinatorics/stars_and_bars.html">stars and bars</a> problem. From this we can see that a nice upper bound can be \(O((n+k-1)C(n))\) where k = n meaning we have \(O((2n-1)C(n))\) which is roughly O((2n) C (n) ), and using <a href="https://stackoverflow.com/questions/39558086/how-to-prove-binomial-coefficient-is-asymptotic-big-theta-of-two-to-the-power-n">stirlings approximation</a> we see that this is \(O(2^n)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define MAXN 8
#define reset_game(G,M) for(int i = 0; i &lt; N;i++)G[i].clear();
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">state</span><span class="p">{</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">d</span><span class="p">;</span>
    <span class="n">string</span> <span class="n">id</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">ai</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">game</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
<span class="n">set</span><span class="o">&lt;</span> <span class="n">string</span> <span class="o">&gt;</span><span class="n">past_game</span><span class="p">;</span>


<span class="n">string</span> <span class="n">to_s</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">){</span>
    <span class="n">stringstream</span> <span class="n">ss</span><span class="p">;</span>
    <span class="n">string</span> <span class="n">ret</span><span class="p">;</span>
    <span class="n">ss</span> <span class="o">&lt;&lt;</span> <span class="n">x</span><span class="p">;</span>
    <span class="n">ss</span> <span class="o">&gt;&gt;</span> <span class="n">ret</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">string</span> <span class="n">to_id</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="p">]){</span>
    <span class="n">string</span> <span class="n">id</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">string</span> <span class="n">t</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
            <span class="n">t</span><span class="o">+=</span> <span class="n">to_s</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="n">t</span><span class="o">+=</span><span class="s">"-"</span><span class="p">;</span>
        <span class="n">id</span><span class="o">+=</span><span class="n">t</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">id</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">bool</span> <span class="n">game_done</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="p">]){</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">empty</span><span class="p">())</span>
            <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">()</span><span class="o">!=</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
            <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">print_game</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span><span class="kt">int</span> <span class="n">d</span><span class="p">,</span><span class="n">string</span> <span class="n">id</span><span class="p">){</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"D:%d ;"</span><span class="p">,</span><span class="n">d</span><span class="p">);</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">id</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%d:"</span><span class="p">,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">bfs</span><span class="p">(){</span>
    <span class="n">queue</span><span class="o">&lt;</span><span class="n">state</span><span class="o">&gt;</span> <span class="n">q</span><span class="p">;</span>
    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span> <span class="p">(</span><span class="n">state</span><span class="p">){</span><span class="n">game</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">game</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">game</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
                    <span class="n">game</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span><span class="n">game</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="n">game</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
                    <span class="n">game</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span><span class="n">game</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="mi">0</span><span class="p">,</span>
                    <span class="n">to_id</span><span class="p">(</span><span class="n">game</span><span class="p">)});</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="p">]</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">g</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">d</span><span class="p">;</span>
        <span class="n">string</span> <span class="n">id</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">id</span><span class="p">;</span>
        <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">if</span><span class="p">(</span><span class="n">past_game</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">id</span><span class="p">)</span> <span class="o">!=</span> <span class="n">past_game</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
            <span class="k">continue</span><span class="p">;</span>
        <span class="k">else</span>
            <span class="n">past_game</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">id</span><span class="p">);</span>
        <span class="c1">//print_game(g,d,id);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">game_done</span><span class="p">(</span><span class="n">g</span><span class="p">)){</span>
            <span class="k">return</span> <span class="n">d</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">empty</span><span class="p">())</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">){</span>
                <span class="kt">int</span> <span class="n">left_end</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
                <span class="kt">int</span> <span class="n">curr_end</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
                <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">empty</span><span class="p">()){</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">curr_end</span><span class="p">);</span>
                    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span> <span class="p">(</span><span class="n">state</span><span class="p">){</span><span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>
                                    <span class="n">to_id</span><span class="p">(</span><span class="n">g</span><span class="p">)});</span>
                    <span class="n">left_end</span><span class="o">++</span><span class="p">;</span><span class="n">curr_end</span><span class="o">--</span><span class="p">;</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">left_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="n">left_end</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">left_end</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]){</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">curr_end</span><span class="p">);</span>
                    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span> <span class="p">(</span><span class="n">state</span><span class="p">){</span><span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>
                                    <span class="n">to_id</span><span class="p">(</span><span class="n">g</span><span class="p">)});</span>
                    <span class="n">left_end</span><span class="o">++</span><span class="p">;</span><span class="n">curr_end</span><span class="o">--</span><span class="p">;</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">left_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="n">left_end</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="o">&lt;</span><span class="n">N</span><span class="p">){</span>
                <span class="kt">int</span> <span class="n">rght_end</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
                <span class="kt">int</span> <span class="n">curr_end</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
                <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">empty</span><span class="p">()){</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">curr_end</span><span class="p">);</span>
                    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span> <span class="p">(</span><span class="n">state</span><span class="p">){</span><span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>
                                    <span class="n">to_id</span><span class="p">(</span><span class="n">g</span><span class="p">)});</span>
                    <span class="n">rght_end</span><span class="o">++</span><span class="p">;</span><span class="n">curr_end</span><span class="o">--</span><span class="p">;</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">rght_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="n">rght_end</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">rght_end</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]){</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">curr_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">curr_end</span><span class="p">);</span>
                    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span> <span class="p">(</span><span class="n">state</span><span class="p">){</span><span class="n">g</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">5</span><span class="p">],</span>
                                    <span class="n">g</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span><span class="n">g</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>
                                    <span class="n">to_id</span><span class="p">(</span><span class="n">g</span><span class="p">)});</span>
                    <span class="n">rght_end</span><span class="o">++</span><span class="p">;</span><span class="n">curr_end</span><span class="o">--</span><span class="p">;</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">rght_end</span><span class="p">]);</span>
                    <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="n">rght_end</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="k">while</span><span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">)</span><span class="o">&amp;&amp;</span> <span class="n">N</span><span class="o">!=</span> <span class="mi">0</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">ai</span><span class="p">);</span>
            <span class="n">game</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">ai</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="c1">//print_game(game,0,to_id(game));</span>
        <span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">bfs</span><span class="p">();</span>
        <span class="k">if</span><span class="p">(</span><span class="n">ans</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="n">printf</span><span class="p">(</span><span class="s">"IMPOSSIBLE</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
        <span class="k">else</span>         <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">ans</span><span class="p">);</span>
        <span class="n">past_game</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
        <span class="n">reset_game</span><span class="p">(</span><span class="n">game</span><span class="p">,</span><span class="n">MAXN</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc12s2p2---the-hungary-games">Solution for <a href="http://wcipeg.com/problem/ccc12s2p2">CCC12S2P2 - The Hungary Games</a></h1>

<p>This problem asks us to find the second shortest path in a graph. This can be done using either Dijkstra’s algorithm or the shortest path faster algorithm, with a small change. This change being that instead of holding the minimum distance to a node, we keep the two smallest distances to a node.</p>

<p>Time Complexity: \(O(E+V)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x x
#define y y
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="mf">1e4</span> <span class="o">+</span> <span class="mi">5</span><span class="p">,</span> <span class="n">INF</span> <span class="o">=</span> <span class="mh">0x3F3F3F3F</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">M</span><span class="p">,</span><span class="n">dist</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span><span class="c1">// city, weight</span>

<span class="kt">void</span> <span class="nf">spfa</span><span class="p">(){</span>
    <span class="n">queue</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">q</span><span class="p">;</span>
    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">));</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">y</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">x</span><span class="p">;</span>
        <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">d</span> <span class="o">+</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">){</span>
                <span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
                <span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">;</span>
                <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">d</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">,</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">));</span>
            <span class="p">}</span>
            <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">d</span> <span class="o">+</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span> 
                    <span class="o">&amp;&amp;</span> <span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">d</span> <span class="o">+</span> <span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">){</span>
                <span class="n">dist</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">;</span>
                <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">d</span><span class="o">+</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">,</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">));</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">dist</span><span class="p">,</span><span class="n">INF</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">dist</span><span class="p">));</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">,</span><span class="o">&amp;</span><span class="n">M</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">l</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">M</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span><span class="o">&amp;</span><span class="n">b</span><span class="p">,</span><span class="o">&amp;</span><span class="n">l</span><span class="p">);</span>
        <span class="n">adj</span><span class="p">[</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="n">l</span><span class="p">));</span>
    <span class="p">}</span>
    <span class="n">spfa</span><span class="p">();</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,(</span><span class="n">dist</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="n">INF</span><span class="p">)</span> <span class="o">?</span> <span class="n">dist</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">:-</span><span class="mi">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc12s2p3---mhocksian-languages">Solution for <a href="http://wcipeg.com/problem/ccc12s2p3">CCC12S2P3 - Mhocksian Languages</a></h1>

<p>This problem asks us if a given word can be created using a set of rules. This can be done by setting a dynamic programming state where each states represents a link between variable and a certain word. Once we have set our state we can use recursion and memorization to check if a word is possible.</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define db 0
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">V</span><span class="p">,</span><span class="n">T</span><span class="p">,</span><span class="n">R</span><span class="p">,</span><span class="n">W</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span><span class="n">var</span><span class="p">;</span>
<span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">rules</span><span class="p">;</span>
<span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span><span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span><span class="kt">bool</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">path</span><span class="p">;</span>
<span class="n">string</span> <span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">;</span>


<span class="kt">bool</span> <span class="nf">possible</span><span class="p">(</span><span class="n">string</span> <span class="n">word</span><span class="p">,</span><span class="n">string</span> <span class="n">var</span><span class="p">){</span>
     <span class="k">if</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">var</span><span class="p">].</span><span class="n">count</span><span class="p">(</span><span class="n">word</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">path</span><span class="p">[</span><span class="n">var</span><span class="p">][</span><span class="n">word</span><span class="p">];</span>
     <span class="k">else</span><span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">word</span><span class="p">.</span><span class="n">length</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">string</span> <span class="n">w1</span> <span class="o">=</span> <span class="n">word</span><span class="p">.</span><span class="n">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">i</span><span class="p">);</span>
            <span class="n">string</span> <span class="n">w2</span> <span class="o">=</span> <span class="n">word</span><span class="p">.</span><span class="n">substr</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">rules</span><span class="p">[</span><span class="n">var</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
                <span class="n">string</span> <span class="n">v1</span><span class="p">;</span> <span class="n">v1</span> <span class="o">+=</span> <span class="n">rules</span><span class="p">[</span><span class="n">var</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
                <span class="n">string</span> <span class="n">v2</span><span class="p">;</span> <span class="n">v2</span> <span class="o">+=</span> <span class="n">rules</span><span class="p">[</span><span class="n">var</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="mi">1</span><span class="p">];</span>
                <span class="k">if</span><span class="p">(</span><span class="n">possible</span><span class="p">(</span><span class="n">w1</span><span class="p">,</span><span class="n">v1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">possible</span><span class="p">(</span><span class="n">w2</span><span class="p">,</span><span class="n">v2</span><span class="p">)){</span>
                   <span class="n">path</span><span class="p">[</span><span class="n">var</span><span class="p">][</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
                   <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
         <span class="n">path</span><span class="p">[</span><span class="n">var</span><span class="p">][</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
         <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
     <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
  <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">V</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">V</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span><span class="c1">// we only care about the first element</span>
       <span class="n">var</span><span class="p">.</span><span class="n">pb</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">T</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">;</span>
    <span class="c1">// we don't care about these</span>
  <span class="p">}</span>
  <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">R</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">R</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">b</span><span class="p">;</span>
    <span class="n">path</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">R</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">R</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">b</span> <span class="o">&gt;&gt;</span> <span class="n">c</span><span class="p">;</span>
    <span class="n">rules</span><span class="p">[</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="n">c</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">W</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">W</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
      <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">;</span>
      <span class="k">if</span><span class="p">(</span><span class="n">possible</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">var</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
         <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
      <span class="k">else</span>
         <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc13s2p2---tourney">Solution for <a href="http://wcipeg.com/problem/ccc13s2p2">CCC13S2P2 - Tourney</a></h1>

<p>This problem asks us to keep track of an ongoing competition and support three queries:</p>

<p>1)  Updating a person’s skill</p>

<p>2)  Finding the number of people a person win’s against</p>

<p>3)  Who won the competition</p>

<p>All of these queries can be solved using two segment trees, the first segment tree represents who won each round of the competition and the second segment tree represents the number of wins each individual had.</p>

<p>Time Complexity: \(O(N + Q\log{N})\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">20</span><span class="p">)</span><span class="o">+</span><span class="mi">5</span><span class="p">,</span><span class="n">inf</span> <span class="o">=</span> <span class="mh">0x3f3f3f3f</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">M</span><span class="p">,</span><span class="n">I</span><span class="p">,</span><span class="n">S</span><span class="p">,</span><span class="n">qlo</span><span class="p">,</span><span class="n">qhi</span><span class="p">,</span><span class="n">idx</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">arr</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span><span class="n">best</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">MAXN</span><span class="p">],</span><span class="n">tree</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">MAXN</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">cmd</span><span class="p">;</span>
<span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">score_to_index</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span><span class="kt">int</span> <span class="n">lo</span><span class="p">,</span><span class="kt">int</span> <span class="n">hi</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">lo</span> <span class="o">&gt;</span> <span class="n">hi</span> <span class="o">||</span> <span class="n">lo</span> <span class="o">&gt;</span> <span class="n">qhi</span> <span class="o">||</span> <span class="n">hi</span> <span class="o">&lt;</span> <span class="n">qlo</span><span class="p">)</span>
       <span class="k">return</span> <span class="o">-</span><span class="n">inf</span><span class="p">;</span>
    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">lo</span> <span class="o">&gt;=</span> <span class="n">qlo</span> <span class="o">&amp;&amp;</span> <span class="n">hi</span> <span class="o">&lt;=</span> <span class="n">qhi</span><span class="p">)</span>
       <span class="k">return</span> <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
    <span class="k">else</span>
       <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">query</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="n">lo</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">query</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">hi</span><span class="p">));</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">query2</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span><span class="kt">int</span> <span class="n">lo</span><span class="p">,</span><span class="kt">int</span> <span class="n">hi</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">lo</span> <span class="o">&gt;</span> <span class="n">hi</span> <span class="o">||</span> <span class="n">lo</span> <span class="o">&gt;</span> <span class="n">qhi</span> <span class="o">||</span> <span class="n">hi</span> <span class="o">&lt;</span> <span class="n">qlo</span><span class="p">)</span>
       <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">==</span> <span class="n">arr</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span>
       <span class="k">return</span> <span class="n">best</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
    <span class="k">else</span>
       <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">query2</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="n">lo</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span> <span class="p">,</span> <span class="n">query2</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">hi</span><span class="p">));</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span><span class="kt">int</span> <span class="n">lo</span><span class="p">,</span><span class="kt">int</span> <span class="n">hi</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&gt;=</span> <span class="n">lo</span> <span class="o">&amp;&amp;</span> <span class="n">idx</span> <span class="o">&lt;=</span> <span class="n">hi</span><span class="p">){</span>
       <span class="k">if</span><span class="p">(</span><span class="n">lo</span> <span class="o">==</span> <span class="n">hi</span><span class="p">)</span>
          <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">lo</span><span class="p">];</span>
       <span class="k">else</span><span class="p">{</span>
          <span class="n">update</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">,</span><span class="n">lo</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">);</span>
          <span class="n">update</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">,(</span><span class="n">lo</span><span class="o">+</span><span class="n">hi</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">hi</span><span class="p">);</span>
          <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">],</span><span class="n">tree</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">]);</span>
          <span class="n">best</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">best</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="p">],</span><span class="n">best</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
       <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">tree</span><span class="p">,</span><span class="o">-</span><span class="n">inf</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">tree</span><span class="p">));</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">,</span><span class="o">&amp;</span><span class="n">M</span><span class="p">);</span><span class="n">N</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">N</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">N</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="n">idx</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
        <span class="n">score_to_index</span><span class="p">[</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
        <span class="n">update</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">M</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">" %c"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">cmd</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cmd</span> <span class="o">==</span> <span class="sc">'R'</span><span class="p">){</span>
          <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">I</span><span class="p">,</span><span class="o">&amp;</span><span class="n">S</span><span class="p">);</span>
          <span class="n">score_to_index</span><span class="p">[</span><span class="n">S</span><span class="p">]</span> <span class="o">=</span> <span class="n">I</span><span class="p">;</span>
          <span class="n">arr</span><span class="p">[</span><span class="n">I</span><span class="p">]</span> <span class="o">=</span> <span class="n">S</span><span class="p">;</span>
          <span class="n">qlo</span> <span class="o">=</span> <span class="n">qhi</span> <span class="o">=</span> <span class="n">idx</span> <span class="o">=</span> <span class="n">I</span><span class="p">;</span>
          <span class="n">update</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cmd</span> <span class="o">==</span> <span class="sc">'W'</span><span class="p">){</span>
          <span class="n">qlo</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span><span class="n">qhi</span> <span class="o">=</span> <span class="n">N</span><span class="p">;</span>
          <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">score_to_index</span><span class="p">[</span><span class="n">query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">)]);</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cmd</span> <span class="o">==</span> <span class="sc">'S'</span><span class="p">){</span>
          <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">I</span><span class="p">);</span>
          <span class="n">idx</span> <span class="o">=</span> <span class="n">qlo</span> <span class="o">=</span> <span class="n">qhi</span> <span class="o">=</span> <span class="n">I</span><span class="p">;</span>
          <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">query2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">N</span><span class="p">));</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc13s2p3---lhc">Solution for <a href="http://wcipeg.com/problem/ccc13s2p3">CCC13S2P3 - LHC</a></h1>

<p>This problem asks us to find the diameter of a tree and to find how many times this diameter appears in the tree.  We can find the diameter of the tree by using two breadth first searches. The key observation to make is that for every diameter in the tree it must always pass through one common node. This node be can found using by traversing  \(diamater/2\) nodes back from the last node in a diameter. Once this central node is found we can divide the problem into two cases:</p>

<p>1)  The diameter of the tree is odd</p>

<p>2)  The diameter of the tree is even</p>

<p>In the case where the diameter of the tree is odd we can prove that all of sub-trees of importance from this central node must be even in height. This is because since the diameter is odd is consists of one node (the central node) and two even branches of equal height. Through this observation we can then   determine the amount of diameters that can be made by checking each sub-tree from the central node and doing some arithmetic and reasoning.
In the case where the diameter of the tree is odd we can prove that there will always be one branch from the central node that is the longest. Then we know we just have to multiply the occurrences of this one branch to the occurrences of the next biggest branch from the central node.</p>

<p>Time Complexity: \(O(E + V)\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 0
#define all(x)(x).begin(),(x).end()
#define x first
#define y second
#define LL long long
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">400000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">tree</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">parent</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">v</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">adj</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>


<span class="kt">void</span> <span class="nf">reset</span><span class="p">(){</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">MAXN</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">parent</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
        <span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">bfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">){</span>
    <span class="n">queue</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="n">q</span><span class="p">;</span>
    <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">fn</span> <span class="o">=</span> <span class="n">mp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">u</span><span class="p">,</span><span class="mi">1</span><span class="p">));</span>
    <span class="n">reset</span><span class="p">();</span>
    <span class="n">v</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
       <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">x</span><span class="p">;</span>
       <span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">().</span><span class="n">y</span><span class="p">;</span>
       <span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
       <span class="k">if</span><span class="p">(</span><span class="n">d</span> <span class="o">&gt;</span> <span class="n">fn</span><span class="p">.</span><span class="n">y</span><span class="p">)</span>
          <span class="n">fn</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">n</span><span class="p">,</span><span class="n">fn</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">d</span><span class="p">;</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
          <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]]){</span>
             <span class="n">parent</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
             <span class="n">v</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]]</span>      <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
             <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">mp</span><span class="p">(</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">],</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">));</span>
           <span class="p">}</span>
       <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">fn</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
      <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
      <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
      <span class="n">v</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
      <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
          <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]]){</span>
            <span class="n">dfs</span><span class="p">(</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span>
            <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">]</span>  <span class="o">&gt;</span> <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]){</span>
               <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
               <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">];</span>
            <span class="p">}</span>
            <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span>
               <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
         <span class="p">}</span>
      <span class="p">}</span>
      <span class="n">tree</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">N</span><span class="p">);</span><span class="n">N</span><span class="o">--</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">sn</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span><span class="o">&amp;</span><span class="n">b</span><span class="p">);</span>
        <span class="n">adj</span><span class="p">[</span><span class="o">--</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="o">--</span><span class="n">b</span><span class="p">);</span>
        <span class="n">adj</span><span class="p">[</span><span class="n">b</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span><span class="n">sn</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="c1">// bfs from one node</span>
    <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">ln1</span> <span class="o">=</span> <span class="n">bfs</span><span class="p">(</span><span class="n">sn</span><span class="p">);</span>
    <span class="c1">// bfs from farthest node</span>
    <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">ln2</span> <span class="o">=</span> <span class="n">bfs</span><span class="p">(</span><span class="n">ln1</span><span class="p">.</span><span class="n">x</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(</span><span class="n">ln2</span><span class="p">.</span><span class="n">y</span><span class="o">%</span><span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">){</span><span class="c1">// the diameter of the tree is odd</span>
       <span class="n">LL</span> <span class="n">longest_path</span> <span class="o">=</span> <span class="n">ln2</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">occurences</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
       <span class="kt">int</span> <span class="n">back_track</span> <span class="o">=</span> <span class="n">ln2</span><span class="p">.</span><span class="n">y</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
       <span class="k">while</span><span class="p">(</span><span class="n">back_track</span><span class="o">--</span><span class="p">){</span><span class="c1">// backtrack to the central node</span>
           <span class="n">ln2</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">parent</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">];</span>
       <span class="p">}</span>
       <span class="c1">// now dfs from the central node</span>
       <span class="n">reset</span><span class="p">();</span>
       <span class="n">dfs</span><span class="p">(</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">);</span>
       <span class="n">LL</span> <span class="n">best</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
       <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
       <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
           <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span> <span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">]){</span>
              <span class="n">occurences</span><span class="o">+=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">]);</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-=</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
           <span class="p">}</span>
       <span class="p">}</span>
       <span class="n">printf</span><span class="p">(</span><span class="s">"%lld %lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">longest_path</span><span class="p">,</span><span class="n">occurences</span><span class="p">);</span>

    <span class="p">}</span><span class="k">else</span><span class="p">{</span><span class="c1">// the diamater of the tree is even</span>
       <span class="n">LL</span> <span class="n">longest_path</span> <span class="o">=</span> <span class="n">ln2</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">occurences</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
       <span class="kt">int</span> <span class="n">back_track</span> <span class="o">=</span> <span class="n">ln2</span><span class="p">.</span><span class="n">y</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
       <span class="k">while</span><span class="p">(</span><span class="n">back_track</span><span class="o">--</span><span class="p">){</span><span class="c1">// backtrack to the central node</span>
           <span class="n">ln2</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">parent</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">];</span>
       <span class="p">}</span>
       <span class="n">reset</span><span class="p">();</span>
       <span class="n">dfs</span><span class="p">(</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">);</span><span class="c1">// find the subtrees</span>
       <span class="n">LL</span> <span class="n">best</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="o">=</span> <span class="p">{</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">},{</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">}};</span>
       <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">].</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
           <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]){</span> <span class="c1">// there is only one subtree of maximal length</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">];</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
           <span class="p">}</span>
           <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]){</span><span class="c1">// there are other trees of smaller length</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">];</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
           <span class="p">}</span>
           <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="c1">// we add up the trees of the same length</span>
              <span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="n">tree</span><span class="p">[</span><span class="n">adj</span><span class="p">[</span><span class="n">ln2</span><span class="p">.</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]][</span><span class="mi">0</span><span class="p">];</span>
       <span class="p">}</span>
       <span class="n">occurences</span> <span class="o">=</span> <span class="n">best</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">best</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
       <span class="n">printf</span><span class="p">(</span><span class="s">"%lld %lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">longest_path</span><span class="p">,</span><span class="n">occurences</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h1 id="solution-for-ccc14s4---tinted-glass-windows">Solution for <a href="http://wcipeg.com/problem/ccc14s4">CCC14S4 - Tinted Glass Windows</a></h1>

<p>This problem asks to find the area for the union of rectangles, if and only if the area in the union of rectangles is greater than or equal to a specified value T. This can be done using a line sweep algorithm. The main idea for the line sweep algorithm shown is that we create vertical line segments for beginning and ending of each rectangle. Once this is done we sort these segments and traverse them in order from lowest x coordinate to the highest.</p>

<p>Time Complexity: \(O(N^{2} \log{N})\)</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre></td><td class="code"><pre><span class="cp">#include</span><span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb push_back
#define mp make_pair
#define db 1
#define lb(x) ((x)&amp;(-x))
#define all(x) (x).begin(),(x).end()
#define needforspeed ios::sync_with_stdio(0);cin.tie(0)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define LL long long
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>


<span class="k">struct</span> <span class="nc">line</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">x</span><span class="p">,</span><span class="n">id</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">y1</span><span class="p">,</span><span class="n">y2</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">tint</span><span class="p">,</span><span class="n">type</span><span class="p">;</span>
    <span class="n">line</span><span class="p">(</span><span class="kt">int</span> <span class="n">_x</span><span class="p">,</span><span class="kt">int</span> <span class="n">_y1</span><span class="p">,</span><span class="kt">int</span> <span class="n">_y2</span><span class="p">,</span><span class="kt">int</span> <span class="n">_tint</span><span class="p">,</span><span class="kt">int</span> <span class="n">_id</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_type</span><span class="p">){</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">_x</span><span class="p">;</span>
        <span class="n">y1</span> <span class="o">=</span> <span class="n">_y1</span><span class="p">,</span><span class="n">y2</span> <span class="o">=</span> <span class="n">_y2</span><span class="p">;</span>
        <span class="n">id</span> <span class="o">=</span> <span class="n">_id</span><span class="p">,</span><span class="n">tint</span> <span class="o">=</span> <span class="n">_tint</span><span class="p">,</span> <span class="n">type</span> <span class="o">=</span> <span class="n">_type</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">bool</span> <span class="k">operator</span> <span class="o">&lt;</span> <span class="p">(</span><span class="k">const</span> <span class="n">line</span><span class="o">&amp;</span><span class="n">rht</span><span class="p">)</span><span class="k">const</span><span class="p">{</span>
       <span class="k">return</span> <span class="n">x</span> <span class="o">==</span> <span class="n">rht</span><span class="p">.</span><span class="n">x</span> <span class="o">?</span> <span class="n">type</span> <span class="o">&lt;</span> <span class="n">rht</span><span class="p">.</span><span class="n">type</span><span class="o">:</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">rht</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
<span class="k">struct</span> <span class="nc">point</span><span class="p">{</span>
   <span class="kt">int</span> <span class="n">y</span><span class="p">,</span><span class="n">id</span><span class="p">;</span>
   <span class="kt">int</span> <span class="n">tint</span><span class="p">,</span><span class="n">type</span><span class="p">;</span>
   <span class="n">point</span><span class="p">(</span><span class="kt">int</span> <span class="n">_y</span><span class="p">,</span><span class="kt">int</span> <span class="n">_id</span><span class="p">,</span><span class="kt">int</span> <span class="n">_tint</span><span class="p">,</span><span class="kt">int</span> <span class="n">_type</span><span class="p">){</span>
         <span class="n">y</span> <span class="o">=</span> <span class="n">_y</span><span class="p">,</span><span class="n">id</span> <span class="o">=</span> <span class="n">_id</span><span class="p">;</span>
         <span class="n">tint</span> <span class="o">=</span> <span class="n">_tint</span><span class="p">,</span> <span class="n">type</span> <span class="o">=</span> <span class="n">_type</span><span class="p">;</span>
   <span class="p">}</span>
   <span class="kt">bool</span> <span class="k">operator</span> <span class="o">&lt;</span> <span class="p">(</span><span class="k">const</span> <span class="n">point</span><span class="o">&amp;</span><span class="n">rht</span><span class="p">)</span><span class="k">const</span><span class="p">{</span>
       <span class="k">return</span> <span class="n">y</span> <span class="o">==</span> <span class="n">rht</span><span class="p">.</span><span class="n">y</span> <span class="o">?</span> <span class="n">type</span> <span class="o">&lt;</span> <span class="n">rht</span><span class="p">.</span><span class="n">type</span><span class="o">:</span><span class="n">y</span> <span class="o">&lt;</span> <span class="n">rht</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>


<span class="k">const</span> <span class="kt">int</span> <span class="n">START</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span><span class="n">END</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">,</span><span class="n">T</span><span class="p">;</span>
<span class="n">LL</span> <span class="n">ANS</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">line</span><span class="o">&gt;</span> <span class="n">segments</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">needforspeed</span><span class="p">;</span>
    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">x1</span><span class="p">,</span><span class="n">y1</span><span class="p">,</span><span class="n">x2</span><span class="p">,</span><span class="n">y2</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">id</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">N</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x1</span> <span class="o">&gt;&gt;</span> <span class="n">y1</span> <span class="o">&gt;&gt;</span> <span class="n">x2</span> <span class="o">&gt;&gt;</span> <span class="n">y2</span> <span class="o">&gt;&gt;</span> <span class="n">t</span><span class="p">;</span>
        <span class="n">segments</span><span class="p">.</span><span class="n">pb</span><span class="p">(</span> <span class="p">(</span><span class="n">line</span><span class="p">){</span><span class="n">x1</span><span class="p">,</span><span class="n">y1</span><span class="p">,</span><span class="n">y2</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">id</span><span class="p">,</span><span class="n">START</span><span class="p">});</span>
        <span class="n">segments</span><span class="p">.</span><span class="n">pb</span><span class="p">(</span> <span class="p">(</span><span class="n">line</span><span class="p">){</span><span class="n">x2</span><span class="p">,</span><span class="n">y1</span><span class="p">,</span><span class="n">y2</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">id</span><span class="p">,</span><span class="n">END</span><span class="p">});</span>
        <span class="n">id</span><span class="o">++</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">segments</span><span class="p">));</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">point</span><span class="o">&gt;</span><span class="n">y_axis</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">segments</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
       <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
          <span class="n">LL</span> <span class="n">delta_x</span> <span class="o">=</span> <span class="n">abs</span><span class="p">(</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="o">-</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">x</span><span class="p">);</span>
          <span class="n">LL</span> <span class="n">ctint</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="n">delta_y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
          <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">y_axis</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
              <span class="k">if</span><span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
                <span class="n">delta_y</span> <span class="o">=</span> <span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">y</span> <span class="o">-</span> <span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">y</span><span class="p">;</span>
                <span class="k">if</span><span class="p">(</span><span class="n">ctint</span> <span class="o">&gt;=</span> <span class="n">T</span><span class="p">)</span>
                   <span class="n">ANS</span> <span class="o">+=</span> <span class="n">delta_x</span><span class="o">*</span><span class="n">delta_y</span><span class="p">;</span>

                <span class="k">if</span><span class="p">(</span><span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">type</span> <span class="o">==</span> <span class="n">START</span><span class="p">)</span>
                   <span class="n">ctint</span> <span class="o">+=</span> <span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">tint</span><span class="p">;</span>
                <span class="k">else</span>
                   <span class="n">ctint</span> <span class="o">-=</span> <span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">tint</span><span class="p">;</span>
              <span class="p">}</span>
              <span class="k">else</span>
                 <span class="n">ctint</span><span class="o">+=</span><span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">tint</span><span class="p">;</span>

          <span class="p">}</span>
          <span class="k">if</span><span class="p">(</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">type</span> <span class="o">==</span> <span class="n">START</span><span class="p">){</span>
             <span class="n">y_axis</span><span class="p">.</span><span class="n">pb</span><span class="p">((</span><span class="n">point</span><span class="p">){</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y1</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">tint</span><span class="p">,</span><span class="n">START</span><span class="p">});</span>
             <span class="n">y_axis</span><span class="p">.</span><span class="n">pb</span><span class="p">((</span><span class="n">point</span><span class="p">){</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y2</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">tint</span><span class="p">,</span><span class="n">END</span><span class="p">});</span>
             <span class="n">sort</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">y_axis</span><span class="p">));</span>
          <span class="p">}</span>
          <span class="k">if</span><span class="p">(</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">type</span> <span class="o">==</span> <span class="n">END</span><span class="p">){</span>
             <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="n">j</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">y_axis</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="n">j</span><span class="o">++</span><span class="p">){</span>
                 <span class="k">if</span><span class="p">(</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span> <span class="o">==</span> <span class="n">y_axis</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">id</span><span class="p">){</span>
                    <span class="n">y_axis</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">y_axis</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="n">j</span><span class="p">);</span>
                    <span class="n">j</span><span class="o">--</span><span class="p">;</span>
                 <span class="p">}</span>
             <span class="p">}</span>
          <span class="p">}</span>
       <span class="p">}</span>
       <span class="k">else</span><span class="p">{</span>
         <span class="n">y_axis</span><span class="p">.</span><span class="n">pb</span><span class="p">((</span><span class="n">point</span><span class="p">){</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y1</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">tint</span><span class="p">,</span><span class="n">START</span><span class="p">});</span>
         <span class="n">y_axis</span><span class="p">.</span><span class="n">pb</span><span class="p">((</span><span class="n">point</span><span class="p">){</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y2</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">,</span><span class="n">segments</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">tint</span><span class="p">,</span><span class="n">END</span><span class="p">});</span>
         <span class="n">sort</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">y_axis</span><span class="p">));</span>
       <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ANS</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Competitive Programming" /><category term="General Programming" /><category term="Programming" /><category term="Canadian Computing Competition" /><category term="Canadian Computing Olympiad" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Open Source in the Enterprise</title><link href="https://wgma.ca/blog/2019-08-14/opensourceenterprise" rel="alternate" type="text/html" title="Open Source in the Enterprise" /><published>2019-08-14T00:00:00+00:00</published><updated>2019-08-14T00:00:00+00:00</updated><id>https://wgma.ca/blog/2019-08-14/opensourceenterprise</id><content type="html" xml:base="https://wgma.ca/blog/2019-08-14/opensourceenterprise"><![CDATA[<h1 id="abstract">Abstract</h1>

<p>Open source has been gaining lots of steam in recent years. Several enterprise companies are adopting these “open source” projects (where source code is free for use, modification and distribution) and advocating for contributions to these projects. But do these projects pose a threat to our safety? While some projects are backed by major corporations, others can be maintained by unidentified developers who hold zero liability for issues in their code.  Here we will look to discuss the benefits open source has on the enterprise and examine the common concerns related to open source software.</p>

<h1 id="introduction">Introduction</h1>

<p>In recent years, open source software has seen greater adoption rates by enterprise companies. Companies that build in-house tools are now deciding to open source portions of their tools to the community for consumption and collaboration. Lots of companies are now openly advertising their open source initiatives to gain favors in the tech community. It wasn’t always like this; historically many enterprise companies were revolted by the idea of open source software. Most notably, in 2003 Microsoft CEO Steve Balmer (a notably anti-open source personality) said, “In the end, there’s no one to be held accountable for flawed software in an open-source model.” (Pennington, 2018). This stance was held firm in Microsoft for 15 years until the new CEO, Satya Mandela, changed the company direction drastically. It is now a big advocate for open source, to the extent that Microsoft is now one of the biggest contributors to open source in terms of active developers (Asay, 2018). These are contradicting perspectives on the topic, which raises the following questions: what benefits do companies get from open source software, and what benefits do companies get from open sourcing their tools? What has changed in the past decade with open source that has sparked this interest, and should companies be adopting open source (i.e., is it safe for consumption)?  These are all important questions that need to be answered to determine the relevancy of open source software in today’s industry.</p>

<h2 id="benefits-of-open-source-software">Benefits of Open Source Software</h2>
<p>One of the main advantages of open source software is the speed it brings to development due to its inherent culture for code reuse. This can range from command line tools which help with analysis or deployment of software, all the way down to GUI components incorporated in the websites we see today. Developers are encouraged to share their solutions, and if they can’t find a solution to their specific use case, to improve an existing solution and share that with the community. This collaboration has created a lot of useful open source software that’s used in industry today. With this widespread availability of software, it has encouraged the “move fast and break things” mindset coined by Facebook. Being able to shop code quickly has made companies like Facebook flourish as they go through many prototypes while receiving constant user feedback. 
Hiring Perspective of Open Source</p>

<h2 id="public-opinion-from-developers-of-open-source">Public Opinion from Developers of Open Source</h2>

<p>A recent 2019 survey on StackOverflow shows that 65% of professional developers on their platform contribute to open source software (Stackoverflow, 2019). Furthermore, a former head of the open source program at Facebook (James Pearce) released survey results stating that about 2/3 of their software developers were aware about the company’s open source efforts and said that it positively contributed to their decision to work for them (DeCausemaker, 2014). So, it is clear from this that developers appreciate open source culture.</p>

<p>Many companies are now following suit by releasing tools which are open sourced like React (from Facebook), Docker (from dotcloud), and VS Code (from Microsoft). These projects now have hundreds of active contributors, a sizable portion of whom aren’t developers that have already been hired from the company. A 2018 report held in partnership with The Linux Foundation and Dice found that hiring open source talent is a priority for 83% of hiring managers from these tech companies; this was taken from a sample size of 750+ hiring managers (The Linux Foundation , 2018). This is advantageous for companies since they can focus fewer resources on hiring developers and, if needed, provides them a proven talent pool from which they can attempt to hire.
Recruiting from Open Source</p>

<p>GitHub is an extremely popular “social coding” playground for developers. Several of the famous open source tools previously mentioned and more are all hosted on this website. So, what better place to look for great developers then the place they hang out? A study done on employers showed that candidates can give a good impression to HR managers through contributions to these popular projects; they treat these contributions as a seal of approval from the developer community that the candidate can write good code (Marlow, 2013). From the sample in this study, they also believed that these were better indicators than reading a resume, since they are able to evaluate soft skills in addition to hard skills by seeing a candidate’s activity regarding managing other people and contributions to their own projects. So, this is a very valid way for people to do recruiting.</p>

<p>From this, we can tell that enterprise companies that decide to participate in the open source culture will have additional resources when it comes to hiring developers.</p>

<h2 id="profitability-in-open-source">Profitability in Open Source</h2>

<p>Clearly, the open source culture provides companies a numbers advantage when it comes to maintaining projects, but where’s the monetary value in this? Initially, people would be quick to think that companies are losing their profit capability when they give up their copyrights. However, there are multiple companies that seem to have thrived in the open source space and are doing extremely well today.</p>

<h3 id="case-study-of-elastic-search">Case study of Elastic Search</h3>

<p>Elastic Search is a famous company which started in 2010 with the release of their ELK (Elastic Logstash Kibana) stack tools. They incorporated existing open source tools like Lucene and Logstash into Elastic Search so they could be able to aggregate and search information from systems. They are a prime example of an open source company that is finding success in the open source space. Their business model revolves around offering enterprise support and solutions on top of their existing open source solution. Elastic Search’s most recent earnings unofficial audit showed that they had a FY19 Revenue of $261.5 million with 1442 employees in over 35 countries worldwide (Elastic Search, 2019).</p>

<h3 id="case-study-of-red-hat">Case study of Red Hat</h3>

<p>Red Hat is a famous company founded in 1993, being the world’s leading provider in enterprise open source solutions. They are the creators of the popular RHEL (Red Hat Enterprise Linux) system, which is used worldwide in several companies’ servers due to its robustness and support. They also manage cloud services like OpenShift and Ansible that help with scaling organizations’ software to the enterprise level (e.g., the likes of Google and Facebook). They are another prime example of an open source company that has found success in open source. Their business model also revolves around offering enterprise support and solutions on top of their existing open source solution. Red Hat’s most recent earnings unofficial audit showed that they had a FY19 Revenue of $3.4 billion (RedHat, 2019).  So, it’s quite evident that open sourcing software can still be quite profitable for some companies which go down this route.</p>

<p>Now what should companies that don’t have the same freedom as these open source companies be concerned about when incorporating open source into their products. While the above companies do give enterprise support for some critical software suites, they cannot possibly provide support on all of the open source projects out there. For many of these projects 
contributions are coming from developers who have zero liability for their work, and who don’t have an incentive to support this for the enterprise, for free. Does this make Steve Balmer’s earlier quote worrying for enterprise adoption? Let’s find out! 
Considerations for Open Source Software</p>

<h1 id="legal-adoption--open-source-licensing">Legal adoption – Open Source Licensing</h1>
<p>If you’re planning on incorporating open source software into your company, the first thing that should come to mind is the copyright terms for these projects. Thankfully this has all been thought out in the past with the release of several open source licenses for company needs. The popular source code management website GitHub had a survey on open source license usage, finding that, overall, about 20% of the projects have a license, and that the clear favourite copyleft licenses were: MIT, GPLv2/3, and Apache. With their usage combined to be about 77.2% of the total licenced projects (Balter, 2015). This is great for companies, since they only have to follow the rules set out by these licenses to begin incorporating them into their work.</p>

<h2 id="copyleft-licenses">Copyleft Licenses</h2>

<p>Copyleft licenses are in a sense the opposite of copyright licences. Whereas copyright restricts the freedom to use, modify, and enhance a product to one sole user, copyleft guarantees the four essential freedoms for free software: freedom to run the program as you wish for any purpose, freedom to study the program and change it as you wish, freedom to redistribute the program to help others, and the freedom to distribute copies of your modified versions to others. Any software that possesses the four freedoms above is considered libre software, coined by Richard Stallman (Free Software Foundation, 2019). All of the open source licenses have aspects that fall under these categories, however, depending on the looseness of the copyright, some may give you less rights than others.</p>

<h2 id="weak-copyleft-licenses">Weak Copyleft Licenses</h2>
<p>Weak copyleft licenses really only require users of the software to give credit to the developer or organization by including the license in whatever piece of code that was written by the project. Everyone can essentially use these licenses without having to worry about copyright practices regarding the usage of the software, and it is indeed free to use. The following are licenses that fall under this category: MIT, BSD, Apache, LGPL. These are great for most enterprise companies because they can freely use and modify the software as they deem fit.  Visual Studio Code is an example of a project with a weak copyleft license (MIT) with some additional license terms that make it not libre software.</p>

<h3 id="strong-copyleft-licenses">Strong Copyleft Licenses</h3>

<p>These are licences that gives you all of the four freedoms mentioned earlier. They are the following: GPLv2, GPLv3, AGPLv3. These licences are special in the fact that any software that uses them must also be sublicensed as GPL licences. There are some minor changes between the GPLv2 and GPLv3, mainly being is more friendly with other licenses, and it has more clarity along the lines of whether you have to disclose the source code if the software is provided over a network. The AGPLv3 however is the special case that makes so that users who use this product over a network must have access to the source code.  These types of licences are generally considered threats for the enterprise due to their viral nature when incorporating them with other works.</p>

<p>Companies need to be vigilant of their licence usage since breaking the terms of service for these GPL can results in major fines from the FSF (Free Software Foundation).  There has been several documented cases of companies being sued for misusing GPL licenced software, one of the earlier recorded cases was in 2007 where the company Busybox	 was suing Westinghouse Digital Electronics for using their GPLv2 licences software on their embedded televisions, and selling it to customers under a new licence that is incompatible with the GPLv2. The damages were $90,000 in total and Busybox won the case (Timmer, 2010).</p>

<p>If you’re planning on incorporating work from these libraries into the enterprise then the obvious choice is to only use weak copyleft licences, since strong copyleft licences pose a potential threat to your companies’ intellectual property.</p>

<h1 id="security-of-open-source-software">Security of Open Source Software</h1>
<p>Many of the components in the software we use daily may be open sourced, take note of the television example from earlier, it’s really easy to incorporate these projects into products. But this begins to become a problem when these components pose a threat to your security.  Some of these open source codebases can be extremely large like the Linux Kernel which now houses 25 million lines of code (Larabel, 2018). These codebases can’t reasonably be manually analyzed for vulnerabilities by a small team of developers, many companies will have to rely on automated or crowd sourcing efforts. And there’s still the question of whether closed source software is more secure than open source software that needs to be answered. 
.</p>
<h2 id="security-open-source-vs-closed-source">Security: Open Source vs Closed Source</h2>
<p>The main argument against open source software being secure, is its lack of security through obscurity. Attackers can easily identify vulnerabilities and abuse it since the source code is open to the public. A recent study concluded that in the long run open source software will be more secure, while closed source software will provide a bigger disadvantage to the defender (Hoepman, 2018). This is because open source software will likely have a spike in beginning as vulnerabilities become public, but as time goes on these vulnerabilities will be patched quickly, thus releasing the vulnerability period. This is not the case with closed source software since more often than not the vulnerabilities will be abused for an extended amount of time before it is identified and patched. This is a result of Linus’s Law: “Given enough eyeballs, bugs are shallow” which simply put is that given enough beta testers and co-developers almost any problem will be identified quickly and fixed accordingly (Raymond, 2000). This same article also provides a real-life example where portions of Microsoft’s Windows NT became public and within days the first exploit was published.</p>

<p>This form of security through collaboration will likely make open source software more secure in the long as security vulnerabilities are identified to developers patched promptly by developers.</p>

<h2 id="auditing-techniques-for-open-source-software">Auditing techniques for Open Source Software</h2>

<p>As mentioned before, with the ever-increasing complexity of projects developers will need a better way to audit this code before consumption. The solution to this is automation or crowd sourcing. Depending on the platform the software is targeting there are a wide variety of tools available for detection of security issues.</p>

<h3 id="static-code-analyzers">Static Code Analyzers</h3>

<p>If you’re developing standalone applications that primarily run on the Linux servers there are a mix of static analyzers like BOON, CQual, and RATS which can help for detecting buffer overflows, inconsistent usage of values, and general inspection of programs for security vulnerabilities. The issue with these tools is that they have a requirement of several hours to analyze modestly sized programs, which isn’t reasonable when you’re trying to moderate code with millions of lines (Cowan, 2003).</p>

<h3 id="cloud-based-solutions">Cloud based solutions</h3>

<p>If you’re developing applications with cloud computing capabilities, then you will likely want to deal with tools at the network level.  There are a wide variety of tools that help with information gathering, scanning, exploitation, and forensic analysis.  Examples are Netcraft (Anti-fraud and Anti Phishing), Nessus (exploits vulnerabilities in system confirmation), Wireshark (network sniffing and monitoring infrastructure tool), and Aqua Scan (docker container risk assessment) (Almatari, 2018). These tools can be very helpful for identifying vulnerabilities in software that you incorporate in your tools before you deploy them to production which can help avoid common abusable issues.</p>

<h3 id="crowd-sourcing">Crowd sourcing</h3>

<p>While many of the automated solutions are great, they mostly have their short comings in terms of performance. A very useful alternative is to crowd source bug finds, this can be accomplished through websites like GitHub. This platform now has a crowd sourcing tools which allow them to alert projects on their platform about vulnerable open source modules they have incorporated (Han, 2017). This feature is extremely helpful for reducing the vulnerability period for several projects, allowing them to either remove the affected module to update to the latest version which likely has a security patch.</p>

<p>From this we can infer that there appears to be a wide variety of tools and crowd sourcing resources available for auditing software. These resources can easily be used to audit open source software and keep the user in the loop for security vulnerabilities that may arise from usage of these open source software projects.</p>

<h1 id="closing-remarks">Closing Remarks</h1>
<p>Open source software seems to have many advantages for enterprise companies. They can greatly benefit from opportunities in hiring and overall business models. There has been a detailed overview on the legal aspects of incorporating open source software into the enterprise, and the rules companies have to abide by to not get into trouble.  We have also discussed the main argument against open source software being secure and found that open source software is actually more secure in the long run.  Enterprise companies can also verify software tools that they’re using by incorporating existing tools to easily audit the software, and they can make use of existing crowd sourcing efforts to stay on top of emerging security vulnerabilities in the software they use. With this we can make the case for open source projects to be adopted by enterprise companies. 
 </p>
<h1 id="bibliography">Bibliography</h1>
<p>Almatari, O. &amp;. (2018, October). Cybersecurity Tools for IS Auditing . Retrieved from https://www.researchgate.net/publication/327369940_Cybersecurity_Tools_for_IS_Auditing</p>

<p>Asay, M. (2018, November 4). Microsoft may be the world’s largest open source contributor, but developers don’t care–yet. Retrieved from https://www.techrepublic.com/article/microsoft-may-be-the-worlds-largest-open-source-contributor-but-developers-dont-yet-care/</p>

<p>Balter, B. (2015, March 9). Open source license usage on GitHub.com . Retrieved from https://github.blog/2015-03-09-open-source-license-usage-on-github-com/</p>

<p>Bui, T. (2014). Analysis of Docker Security. Retrieved from https://arxiv.org/pdf/1501.02967.pdf</p>

<p>Cowan, C. (2003). Software Security for Open-Source Systems. Retrieved from https://journals-scholarsportal-info.myaccess.library.utoronto.ca/pdf/15407993/v01i0001/38_ssfos.xml</p>

<p>DeCausemaker, R. (2014, Oct 22). Head of Open Source at Facebook opens up . Retrieved from https://opensource.com/business/14/10/head-of-open-source-facebook-oscon</p>

<p>Elastic Search. (2019, August). Elastic N.V. Reports Strong Fourth Quarter and Fiscal 2019 Financial Results. Retrieved from https://ir.elastic.co/Cache/1001253311.PDF?O=PDF&amp;T=&amp;Y=&amp;D=&amp;FID=1001253311&amp;iid=5249851</p>

<p>Free Software Foundation. (2019, 07 30). Retrieved from https://www.gnu.org/philosophy/free-sw.en.html</p>

<p>Han, M. (2017, November 16). Introducing security alerts on GitHub . Retrieved from https://github.blog/2017-11-16-introducing-security-alerts-on-github/</p>

<p>Hoepman, J.-H. (2018). Increased security through open source ∗. Retrieved from https://arxiv.org/pdf/0801.3924.pdf</p>

<p>Larabel, M. (2018, September 16). The Linux Kernel Has Grown By 225k Lines of Code So Far This Year From 3.3k Developers . Retrieved from https://www.phoronix.com/scan.php?page=news_item&amp;px=Linux-September-2018-Stats</p>

<p>Marlow, J. (2013). Activity Traces and Signals in Software Developer Recruitment and Hiring. Retrieved from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.463.6673&amp;rep=rep1&amp;type=pdf</p>

<p>Pennington, H. (2018, March 15). Steve Ballmer was right about open source . Retrieved from tidelift: https://blog.tidelift.com/steve-ballmer-was-right-about-open-source</p>

<p>Raymond, E. S. (2000). The cathedral and the bazaar.</p>

<p>RedHat. (2019, March 25). Retrieved from https://investors.redhat.com/news-and-events/press-releases/2019/03-25-2019-201454520</p>

<p>Stackoverflow. (2019, 07 07). Developer Survey Results 2019. Retrieved from https://insights.stackoverflow.com/survey/2019</p>

<p>Synopsis. (2014, April 29). The Heartbleedbug. Retrieved from heartbleed: http://heartbleed.com/</p>

<p>The Linux Foundation . (2018). Open Source Talent in Demand, With Linux Back on Top. Retrieved from https://www.linuxfoundation.org/publications/2018/06/open-source-jobs-report-2018/</p>

<p>Timmer, J. (2010, August 05). https://arstechnica.com/information-technology/2010/08/court-rules-gpl-part-of-a-well-pleaded-case/. Retrieved from arstechnica: https://arstechnica.com/information-technology/2010/08/court-rules-gpl-part-of-a-well-pleaded-case/</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Open Source" /><category term="Open Source" /><category term="Recruiting" /><category term="Techonology" /><summary type="html"><![CDATA[Abstract]]></summary></entry><entry><title type="html">Infamous Heisenbug</title><link href="https://wgma.ca/blog/2018-03-09/heisenbug" rel="alternate" type="text/html" title="Infamous Heisenbug" /><published>2018-03-09T00:00:00+00:00</published><updated>2018-03-09T00:00:00+00:00</updated><id>https://wgma.ca/blog/2018-03-09/heisenbug</id><content type="html" xml:base="https://wgma.ca/blog/2018-03-09/heisenbug"><![CDATA[<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

<p>Solution for <a href="http://wcipeg.com/problem/noi00p1">NOI00P1 - Cermaic Necklace</a> 
<a href="https://en.wikipedia.org/wiki/Heisenbug">Heisenbugs</a> are quite interesting but often people will have never heard of the terminology or better yet, experience it in practice.  Well today I will show you a heisenbug I encountered while solving a contest problem. This problem had me scratching my head until I had to ask <a href="http://alexli.ca">Alex Li</a> during <a href="https://en.wikipedia.org/wiki/Woburn_Collegiate_Institute#Programming_Enrichment_Group_.28PEG.29">PEG</a>.</p>

<p>This problem is quite trivial after you look through the distracting diagrams. The jist of the problem is that we need to find the largest disk which can be created with the provided variables \(\color{white}{V_0}\) and \(\color{white}{V_{total}}\).</p>

<p><strong>Offending solution</strong></p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cmath&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">V</span><span class="p">,</span><span class="n">V0</span><span class="p">,</span><span class="n">disks</span><span class="p">,</span><span class="n">cnt</span><span class="p">;</span>
<span class="kt">double</span> <span class="n">best</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">freopen</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">,</span><span class="s">"r"</span><span class="p">,</span><span class="n">stdin</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d%d"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">V</span><span class="p">,</span><span class="o">&amp;</span><span class="n">V0</span><span class="p">);</span>
    <span class="c1">//printf("%d %d\n",V,V0);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">V</span><span class="o">/</span><span class="n">V0</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">len</span> <span class="o">=</span> <span class="n">i</span><span class="o">*</span><span class="mf">0.3</span><span class="o">*</span><span class="n">sqrt</span><span class="p">((</span><span class="kt">double</span><span class="p">)</span><span class="n">V</span><span class="o">/</span><span class="n">i</span><span class="o">-</span><span class="n">V0</span><span class="p">);</span>
        <span class="c1">//printf("%d %.2f\n",i,len);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">len</span> <span class="o">&gt;</span> <span class="n">best</span><span class="p">){</span>
            <span class="n">best</span>  <span class="o">=</span> <span class="n">len</span><span class="p">;</span>
            <span class="n">disks</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
            <span class="n">cnt</span>   <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">len</span> <span class="o">==</span> <span class="n">best</span><span class="p">){</span>
            <span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="c1">//printf("%d\n",cnt);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="p">(</span><span class="n">cnt</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">?</span> <span class="mi">0</span><span class="o">:</span><span class="n">disks</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><strong>Input, compilation, and output</strong></p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cat </span>input.txt
10
2
g++ heisenbug.cpp <span class="nt">-o</span> heisenbug <span class="o">&amp;&amp;</span> <span class="nb">time</span> ./heisenbug
3

real    0m0.002s
user    0m0.001s
sys     0m0.000s</code></pre></figure>

<p>So what’s wrong with this solution? Logically it makes sense, it just doesn’t seem to produce the correct answer. More concerning is that when we try debugging the program by printing out each variable we notice that the problem seemingly disapears and produces the correct answer, witchcraft I say!</p>

<p>The issue arises due to C++’s compilation optimizations. The quick fix to this problem is to change the following:</p>

<figure class="highlight"><pre><code class="language-c--" data-lang="c++"><span class="k">volatile</span> <span class="kt">double</span> <span class="n">best</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span></code></pre></figure>

<p>Why does this work? And what does the volatile keyword do exactly? Here’s a concise definition from <a href="https://en.wikipedia.org/wiki/Volatile_(computer_programming)">Wikipedia</a>.</p>

<blockquote>
  <p>The volatile keyword indicates that a value may change between different accesses, even if it does not appear to be modified. This keyword prevents an optimizing compiler from optimizing away subsequent reads or writes and thus incorrectly reusing a stale value or omitting writes.</p>
</blockquote>

<p>After reading this the problem becomes quite trivial to explain. During compilation C++ took some liberties and assumed that the variable <strong>len</strong> would not change between accesses. Hence it used a stale/old value of the variables when evaluated the inequalities, thus resulting in an incorrect answer. The volatile keywords now forces the compiler to check the value at the memory registy every time the variable is reffered to, thus fixing the issue.</p>

<p><strong>Input, compilation, and output with modification</strong></p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">cat </span>input.txt
10
2
g++ heisenbug.cpp <span class="nt">-o</span> heisenbug <span class="o">&amp;&amp;</span> <span class="nb">time</span> ./heisenbug
0

real    0m0.002s
user    0m0.001s
sys     0m0.000s</code></pre></figure>

<p>It would seem our little fix worked! Now, some food for thought, why don’t we always use the volatile keyword? Clearly this problem should be affecting all our programs! Well that’s not entirely true. In general the C++ compiler is quite smart and for most cases actually manages to optimize correctly.</p>

<p>Another major point is that forcing the C++ compiler to manually check the value at the registry every time it compiles will cause our program/software to slowdown since it is quite tasking. So make sure to use the volatile keyword sparingly.</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Competitive Programming" /><category term="General Programming" /><category term="Programming" /><category term="Mathematics" /><category term="Compiler Optimization" /><category term="Heisenbug" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Road to Top 10 ORAS OU</title><link href="https://wgma.ca/blog/2016-10-17/toptenorasou" rel="alternate" type="text/html" title="Road to Top 10 ORAS OU" /><published>2016-10-17T00:00:00+00:00</published><updated>2016-10-17T00:00:00+00:00</updated><id>https://wgma.ca/blog/2016-10-17/toptenorasou</id><content type="html" xml:base="https://wgma.ca/blog/2016-10-17/toptenorasou"><![CDATA[<p>After years of playing smogon’s <a href="http://www.smogon.com/dex/xy/formats/ou/">ORAS OU</a> metagame I have finally made a spot for myself in the top 10 ranking. I come in at lucky number 7 with an Elo rating of 1959, GXE of 82.3% and a Glicko-1 of 1790 ± 25 (<a href="http://www.smogon.com/smog/issue43/elo-hello">more details</a>). The team I used was the ever popular <a href="http://www.smogon.com/forums/members/abr.223276/">ABR</a>/<a href="http://www.smogon.com/forums/members/blunder.112856/">Blunder</a> Medi squad, a pastebin can be found <a href="http://pastebin.com/nzEzH4yK">here</a> for those who wish to use the team. Now I will pay homage to both my opponent and Robin Williams, <a href="https://www.youtube.com/watch?v=vi0Lbjs5ECI">Carpe diem: Seize the day</a>.</p>

<h2 id="highlights">Highlights</h2>
<p><b><center><a href="/images/top-ten-oras-ou/OU-2016-10-17-wgma-seiz3thed4y.html">wgma☁️ ³ ³⌚  vs seiz3 the d4y</a></center></b></p>
<p style="float: left; font-size: 9pt; text-align: center; width: 66%; margin-right: 1%; margin-bottom: 0.5em;"><img src="/images/top-ten-oras-ou/2016-10-17-crop2.png" style="width: 100%" />Battle: 6-2 Win</p>
<p style="float: left; font-size: 9pt; text-align: center; width: 32%; margin-right: 1%; margin-bottom: 0.5em;"><img src="/images/top-ten-oras-ou/2016-10-17-crop.png" style="width: 100% height: 140%" />Ladder Update - 7th place overall</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Gaming" /><category term="Pokemon" /><category term="ORAS" /><category term="Overused" /><category term="Smogon" /><summary type="html"><![CDATA[After years of playing smogon’s ORAS OU metagame I have finally made a spot for myself in the top 10 ranking. I come in at lucky number 7 with an Elo rating of 1959, GXE of 82.3% and a Glicko-1 of 1790 ± 25 (more details). The team I used was the ever popular ABR/Blunder Medi squad, a pastebin can be found here for those who wish to use the team. Now I will pay homage to both my opponent and Robin Williams, Carpe diem: Seize the day.]]></summary></entry><entry><title type="html">Ottawa Trip - February</title><link href="https://wgma.ca/blog/2016-09-27/ottawatrip" rel="alternate" type="text/html" title="Ottawa Trip - February" /><published>2016-09-27T00:00:00+00:00</published><updated>2016-09-27T00:00:00+00:00</updated><id>https://wgma.ca/blog/2016-09-27/ottawatrip</id><content type="html" xml:base="https://wgma.ca/blog/2016-09-27/ottawatrip"><![CDATA[<p>During our winter reading week me and a couple of students in the Computer Science program decided to take a trip (arranged by UofT) to our countries capital Ottawa! We shared a room in the <a href="https://www.google.ca/maps/place/Cartier+Place+Suite+Hotel/@45.4187445,-75.6919691,17z/data=!4m5!3m4!1s0x4cce05a972255147:0x2fa45bf43be904c8!8m2!3d45.4187408!4d-75.6897804">Cartier Place Suite Hotel</a> and stayed there for three nights. It was bitter cold at times reaching lows of -15°C; fortunately that doesn’t daze the hardiest of Canadians! I gotta meet some great people and I got to network with some great software companies on the visit. Below I have shared some pictures/videos from my trip and hopes that I’ll motivate others like yourself to visit our countries capital.</p>

<h1 id="first-day-at-the-nature-musuem">First day at the Nature Musuem</h1>

<p>On our first day in Ottawa we arrived rather late around 4pm. Having a thirst for adventure my roommates and I decided to look online for tourist attractions near our area. To our luck the only location open  was the Nature Musuem; and it closed at 5pm. We made haste and battled through mounds of snow that were as high as our knees. We arrived 20 mins before closing and were told by the receptionists that the musuem was free for the last 20 mins. With this knowledge we raced through each floor taking as many pictures as we could. Unfortuantely I only managed to get through three floors, but one of us did manage to get four.</p>

<p><img src="/images/ottawa-trip-2016/20160217_165456.jpg" alt="Huge Butterfly" />
<em>Butterflies don’t actually get this big do they?</em>
<img src="/images/ottawa-trip-2016/20160217_165018.jpg" alt="Seal" /> 
<em>Just can’t help but to smile back:)</em>
<img src="/images/ottawa-trip-2016/20160217_165145.jpg" alt="Seal" /> 
<em>Intense</em></p>

<h1 id="second-day-at-the-library-of-parliament">Second day at the Library of Parliament</h1>

<p>On our second day in Ottawa we took a trip with the whole group to see the parliament building. It was quite big and and it took our group some time to get through the metal detector gates. We were given a breif tour of the building and were also given a peculiar history of the building. We were told that we were actually standing in the rebuilt version of parliamentary building, as the building was burned down in <a href="https://en.wikipedia.org/wiki/Burning_of_the_Parliament_Buildings_in_Montreal">1849</a>. Unfortuantely we did not get to examine the house of commons as their was an official meeting going at the time, so instead we were directed to the library. As our guide was telling us the history of the library most of us decided to take a video of the place as it was quite expansive and beautiful.</p>

<iframe width="420" height="315" src="https://www.youtube.com/embed/xoFRrE2XrHU" frameborder="0" allowfullscreen=""></iframe>

<h1 id="final-day-out-in-ottawa">Final day out in Ottawa</h1>
<p>On our final day my we roommates and I decided to split up. A few of us went to the mall, while the others and I went to skate on the Rideau River. This was my first time skating and it was a terrifying but rewarding experience. I remember having my jaw dropp as the occasional rockstars decided to bless us at the skate shack with their awesome moves. For me it was quite frustrating as skating seemed so simple and elegant on television but in reality was quite difficult. I often found myself taking baby steps and pacing along the side of the river in the hopes of me not falling down unlike my friend who fell down every couple of minutes. After skating for an hour I decided to take a break and was approached by a local. I was told that since he was leaving I could help myself to the remaining maple syrup popsicles. And so I did (Please check him out if you’re skating by the river).</p>

<p>On our way back to our hotel we passed through Ottawa Park and noticed a wonderful sight. The image in the middle was a glass art piece that lighted up when the sun started setting. You don’t see that in Toronto everyday. As we continued forward we met up with our other roomates and exchanged some concerns, while we did have fun, we wanted to make our last night memorable. So we decided to eat out in a resturant located in Ottawa’s China Town. Waiting for transit was quite a challenge as we had to a battle with the ever freezing night. Even with my heaviest goose jacket I found my self shivering from the cold. But at last when the bus came we knew our journey was for not. Upon arriving to our destination we saw the warm welcome in the picture to the right and promptly entered the <a href="http://www.yangtze.ca/">Yangtze</a> restaurant to celebrate our trip.</p>

<p style="float: left; font-size: 9pt; text-align: center; width: 32%; margin-right: 1%; margin-bottom: 0.5em;"><img src="/images/ottawa-trip-2016/rideauriver.jpg" style="width: 100%" />Me learning how to skate</p>
<p style="float: left; font-size: 9pt; text-align: center; width: 32%; margin-right: 1%; margin-bottom: 0.5em;"><img src="/images/ottawa-trip-2016/20160217_174733.jpg" style="width: 100%" />Ottawa Park</p>
<p style="float: left; font-size: 9pt; text-align: center; width: 32%; margin-right: 1%; margin-bottom: 0.5em;"><img src="/images/ottawa-trip-2016/20160218_193254.jpg" style="width: 100%" />China Town</p>

<h1 id="overall">Overall</h1>
<p>I really enjoyed my experience in Ottawa and would definately go back given the chance!</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Travelling" /><category term="Ottawa" /><category term="Nature Musuem" /><category term="Parliament" /><category term="Ice Skating" /><summary type="html"><![CDATA[During our winter reading week me and a couple of students in the Computer Science program decided to take a trip (arranged by UofT) to our countries capital Ottawa! We shared a room in the Cartier Place Suite Hotel and stayed there for three nights. It was bitter cold at times reaching lows of -15°C; fortunately that doesn’t daze the hardiest of Canadians! I gotta meet some great people and I got to network with some great software companies on the visit. Below I have shared some pictures/videos from my trip and hopes that I’ll motivate others like yourself to visit our countries capital.]]></summary></entry><entry><title type="html">Fire Emblem Awakening - Apostheosis</title><link href="https://wgma.ca/blog/2016-09-22/fire-emblem-awakening-apostheosis" rel="alternate" type="text/html" title="Fire Emblem Awakening - Apostheosis" /><published>2016-09-22T06:41:39+00:00</published><updated>2016-09-22T06:41:39+00:00</updated><id>https://wgma.ca/blog/2016-09-22/fire-emblem-awakening-apostheosis</id><content type="html" xml:base="https://wgma.ca/blog/2016-09-22/fire-emblem-awakening-apostheosis"><![CDATA[<p><img src="/images/fire_emblem/fire_emblem2.jpeg" alt="Actual Best Grills" class="center-image" /></p>

<p>Apostheosis is a DLC map available to fire emblem awakening afficionados wanting to test their strategizing to the fullest. This map pits you against five waves of increasingly harder enemies to face, with the last wave possessing the hardest boss: Anna.</p>

<p>Here I will be posting my Aposthesis team that helped me defeat the map on Lunatic+.  Take note that everyone has maxed out stats and all of their weapons are forged with max damage/accuracy.</p>

<h1 id="pairings">Pairings</h1>

<p><img src="/images/fire_emblem/pairingwhore.PNG" alt="Shipping lord" class="center-image" /></p>

<p>Here you will find what I passed down and my reasoning for most stuff. I generally tried to give everyone Luna since it’s very important on this map. You may be wondering why I passed down some skills like dual support+ and counter.  The main reason why I did this is because they gender exclusive skills and all the other passable skills can be obtained through reclassing.</p>

<h3 id="chromolivia">Chrom!Olivia</h3>
<p><strong>Comments:</strong> Luna and decent mods.<br />
<strong>Pass Down:</strong> Rightful King, Galeforce<br />
<strong>Children:</strong> Lucina, Inigo</p>

<h3 id="rickenlissa">Ricken!Lissa</h3>
<p><strong>Comments:</strong> Access to Luna and Magic mods<br />
<strong>Pass Down:</strong> Luna, Galeforce<br />
<strong>Child:</strong> Owain</p>

<h3 id="donnelsully">Donnel!Sully</h3>
<p><strong>Comments:</strong> Galeforce and Mercenary to complete Kjelle’s skill pool.<br />
<strong>Pass Down:</strong> Counter, Dual Guard+<br />
<strong>Child:</strong> Kjelle</p>

<h3 id="stahlcordelia">Stahl!Cordelia</h3>
<p><strong>Comments:</strong> Great mods, and access to Luna<br />
<strong>Pass Down:</strong> Swordfaire, Sol<br />
<strong>Child:</strong> Severa</p>

<h3 id="mutharja">MU!Tharja</h3>
<p><strong>Comments:</strong> Great magic mods, and makes Noire have a good move pool.<br />
<strong>Pass Down:</strong> Counter, Vengeance<br />
<strong>Children:</strong> Morgan, Noire</p>

<h3 id="maribellelonqu">Maribelle!Lon’qu</h3>
<p><strong>Comments:</strong> Vantage + great speed mods to compliment Brady’s move pool.<br />
<strong>Pass Down:</strong> Vantage, Galeforce<br />
<strong>Child:</strong> Brady</p>

<h3 id="frederickcherche">Frederick!Cherche</h3>
<p><strong>Comments:</strong> Makes Gerome a very good support unit.<br />
<strong>Pass Down:</strong> Dual Guard+, Dual Support+<br />
<strong>Child:</strong> Gerome</p>

<h3 id="henrysumia">Henry!Sumia</h3>
<p><strong>Comments:</strong> Magic mods, and makes Cynthia a great dark flyer<br />
<strong>Pass Down:</strong> Counter, Galeforce<br />
<strong>Child:</strong> Cynthia</p>

<h3 id="gregormiriel">Gregor!Miriel</h3>
<p><strong>Comments:</strong> Really only wanted him to have Armsthrift<br />
<strong>Pass Down:</strong> Armsthrift, Dual Support+<br />
<strong>Child:</strong> Laurent</p>

<h3 id="kellampanne">Kellam!Panne</h3>
<p><strong>Comments:</strong> Makes a great beserker and is a hard counter to Anna<br />
<strong>Pass Down:</strong> Luna, Lancebreaker<br />
<strong>Child:</strong> Yarne</p>

<h3 id="vaikenowi">Vaike!Nowi</h3>
<p><strong>Comments:</strong> Makes Nah pretty tank with hellswrath<br />
<strong>Pass Down:</strong> Axefaire, Deliverer<br />
<strong>Child:</strong> Nah</p>

<h1 id="individual-units">Individual Units</h1>
<p><img src="/images/fire_emblem/ignis.jpg" alt="Shipping lord" class="center-image" /></p>

<h3 id="chrom">Chrom</h3>
<p><strong>Class:</strong> Paladin<br />
<strong>Skills:</strong> Aether, Dual Strike+, Dual Guard+, Rightful King, Limit Breaker<br />
<strong>Inventory:</strong> Brave Sword, Brave Sword, Brace Lance, Brave Lance, Elixer</p>

<h3 id="morgan">Morgan</h3>
<p><strong>Class:</strong> Dark Flier<br />
<strong>Skills:</strong> Luna, Tomefaire, Armsthrift, Galeforce, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Rescue, Rescue, Elixir</p>

<h3 id="noire">Noire</h3>
<p><strong>Class:</strong> Dark Flier<br />
<strong>Skills:</strong> Luna, Tomefaire, Armsthrift, Galeforce, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Rescue, Fortify, Elixir</p>

<h3 id="mu">MU</h3>
<p><strong>Class:</strong> Sage<br />
<strong>Skills:</strong> Luna, Aggresor, Tombfaire, Armsthrift, Limit breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Rescue, Rescue, Elixir</p>

<h3 id="laurent">Laurent</h3>
<p><strong>Class:</strong> Sage<br />
<strong>Skills:</strong> Sol, Aggresor, Tombfaire, Armsthrift, Limit breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Fortify, Rescue, Rescue, Elixir</p>

<h3 id="kjelle">Kjelle</h3>
<p><strong>Class:</strong> Dark Flier<br />
<strong>Skills:</strong> Luna, Deliverer, Armsthrift, Galeforce, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Rescue, Fortify, Elixir</p>

<h3 id="lucina">Lucina</h3>
<p><strong>Class:</strong> Assasin<br />
<strong>Skills:</strong> Dual Strike+, Galeforce, Rightful King, Luna, Limit Breaker<br />
<strong>Inventory:</strong> Brave Sword, Brave Sword, Brave Bow, Brave Bow, Elixer</p>

<h3 id="severa">Severa</h3>
<p><strong>Class:</strong> Paladin<br />
<strong>Skills:</strong> Luna, Swordfaire, Galeforce, Armthrift, Limit Breaker<br />
<strong>Inventory:</strong> Gradivus, Brave Sword, Brave Lance, Elixer</p>

<h3 id="inigo">Inigo</h3>
<p><strong>Class:</strong> Hero<br />
<strong>Skills:</strong> Luna, Aggresor, Galeforce, Armthrift, Limit Breaker<br />
<strong>Inventory:</strong> Brave Sword, Brave Axe, Tomahawk, Elixir</p>

<h3 id="owain">Owain</h3>
<p><strong>Class:</strong> Sage<br />
<strong>Skills:</strong> Luna, Aggresor, Tomefaire, Galeforce, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Celica’s Gale, Celica’s Gale, Rescue</p>

<h3 id="cynthia">Cynthia</h3>
<p><strong>Class:</strong> Dark Flier<br />
<strong>Skills:</strong> Luna, Tomefaire, Galeforce, Dual Support+, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Celica’s Gale, Rescue, Rescue</p>

<h3 id="brady">Brady</h3>
<p><strong>Class:</strong> Sage<br />
<strong>Skills:</strong> Luna, Aggresor, Tomefaire, Galeforce, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Celica’s Gale, Fortify, Rescue</p>

<h3 id="lissa">Lissa</h3>
<p><strong>Class:</strong> Dark Flier<br />
<strong>Skills:</strong> Renewal, Tomefaire, Galeforce, Dual Support+, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Fortify, Rescue, Rescue</p>

<h3 id="ricken">Ricken</h3>
<p><strong>Class:</strong> Sage<br />
<strong>Skills:</strong> Luna, Aggresor, Tomefaire, Dual Guard+, Limit Breaker<br />
<strong>Inventory:</strong> Celica’s Gale, Celica’s Gale, Fortify,  Rescue, Rescue</p>

<h3 id="gerome">Gerome</h3>
<p><strong>Class:</strong> Paladin<br />
<strong>Skills:</strong> Dual Support+, Dual Guard+, Deliverer, Luna, Limit Breaker<br />
<strong>Inventory:</strong> Brave Lance, Brave Sword, Brave Sword, Spear, Elixir</p>

<h3 id="nah">Nah</h3>
<p><strong>Class:</strong> Hero<br />
<strong>Skills:</strong> Luna, Pavise, Axefaire, Armsthrift, Limit Breaker<br />
<strong>Inventory:</strong> Brave Sword, Brave Axe, Tomahawk, Hellswrath, Elixir</p>

<h3 id="yarne">Yarne</h3>
<p><strong>Class:</strong> Berserker<br />
<strong>Skills:</strong> Luna, Lancebreaker, Axefaire, Dual Guard+, Limit Breaker<br />
<strong>Inventory:</strong> Brave Axe, Brave Axe, Tomahawk, Elixir</p>

<h3 id="olivia">Olivia</h3>
<p><strong>Class:</strong> Dancer<br />
<strong>Skills:</strong> Swordfaire, Astra, Galeforce, Special Dance, Limit Breaker<br />
<strong>Inventory:</strong> Brave Sword, Brave Sword, Brave Sword, Elixir</p>

<h3 id="eldigan">Eldigan</h3>
<p><strong>Class:</strong> Wyvern Lord<br />
<strong>Skills:</strong> Rally Strength, Rally Speed, Rally Skill, Rally Defense, Rally Spectrum<br />
<strong>Inventory:</strong> Brave Lance, Brave Axe</p>

<h3 id="wilhemina">Wilhemina</h3>
<p><strong>Class:</strong> Falcon Knight<br />
<strong>Skills:</strong> Rally Magic, Rally Speed, Rally Resistance, Rally Movement, Rally Spectrum<br />
<strong>Inventory:</strong> Rescue, Rescue, Fortify, Fortify, Goddess Staff</p>

<h1 id="pair-ups">Pair-ups</h1>

<p><img src="/images/fire_emblem/pairup.jpg" alt="pairups" class="center-image" /></p>

<h3 id="bradymorgan"><strong>Brady!Morgan</strong></h3>
<p>Power couple, break through enemies with magic power and gale force</p>

<h3 id="owainnoire"><strong>Owain!Noire</strong></h3>
<p>Power couple, break through enemies with magic power and gale force</p>

<h3 id="laurentcynthia"><strong>Laurent!Cynthia</strong></h3>
<p>Power couple, break through enemies with magic power and gale force</p>

<h3 id="geromelucina"><strong>Gerome!Lucina</strong></h3>
<p>Power couple, and utility couple. Allows Lucina to pick off enemies with insane Luna procs and doubles.</p>

<h3 id="severainigo"><strong>Severa!Inigo</strong></h3>
<p>Power couple, break through enemes with strong offenses and gale force</p>

<h3 id="nahyarne"><strong>Nah!Yarne</strong></h3>
<p>Utility couple, keep yarne alive until Anna comes lol</p>

<h3 id="mukjelle"><strong>MU!Kjelle</strong></h3>
<p>Power couple, break through enemies with magic power and gale force</p>

<h3 id="wilhemina-mu-from-different-file-eldigan"><strong>Wilhemina (MU from different file), Eldigan</strong></h3>
<p>Rally bots</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="Gaming" /><category term="Gaming" /><category term="Fire Emblem" /><category term="Nintendo" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Pokémon Rant #1</title><link href="https://wgma.ca/blog/2015-10-27/pokemon-rant" rel="alternate" type="text/html" title="Pokémon Rant #1" /><published>2015-10-27T00:00:00+00:00</published><updated>2015-10-27T00:00:00+00:00</updated><id>https://wgma.ca/blog/2015-10-27/pokemon-rant</id><content type="html" xml:base="https://wgma.ca/blog/2015-10-27/pokemon-rant"><![CDATA[<p>Ever since the release of Pokémon ORAS (6th generation), I have seen the meta-game evolve in an unexpected way. This once intellectually-stimulating game has fallen from grace and has turned into a meta-game where everyone has decided that their main priority is to status their opponent’s Pokémon. This mentality has caused many players, in my experience, to make brain-dead plays/decisions in battles. This is likely because are no repercussions for doing so, unlike for other statuses like sleep (smogon sleep clause). But before I dive into this topic, how about we take a walk down memory lane and see how the previous generations led up to the current one?</p>

<p><img src="/images/dialga-palkia-giratina.jpg" alt="" />
<em>Box art legendaries for DPP</em></p>

<p>The DPP (Diamond/Pearl/Platinum) meta-game was the 4th installment (generation) of the Pokémon franchise, and was the first installment where there was a prominent online community for competive Pokémon. In the DPP meta-game, OU was arguably the most balanced. Unfortunately, the variety then was quite scarce, since there was a limited selection of Pokémon to choose from. In this meta-game, everything had a check/counter (unless someone got really lucky with Machamp’s DynamicPunch), and all of the play styles (balanced, hyper offense, stall) were quite viable. This meta-game promoted critical thinking, as you had to predict what options your opponent had to take against you in order to win. Also note that, in this generation, status moves like Thunder Wave were not as prevalent as they are now. This environment made for an enjoyable meta-game where the winner of a battle was decided on their skill, and not luck (most of the time).</p>

<p><img src="/images/perma-weather.png" alt="" />
<em>The 5 central powers for Generation 5 of Pokmeon</em></p>

<p>After this came the Black and White (5th generation) OU meta-game, where the tier revolved around the following Pokémon: Ninetails, Politoed, Hippowdon, Abomasnow, and Tyranitar. These Pokémon all respectively had the following abilities: Drought (Sun), Drizzle (Rain), Sand Stream (Sandstorm), and Snow Warning (Hail). These weather conditions, for the most part, hindered your opponent’s Pokémon and gave tremendous benefits to your own Pokémon, assuming your team was built well. The most common abusers of these weather conditions were Volcarona (Sun/Rain), Keldeo (Rain), Excadrill (Sand), and Black Kyurem (Hail). From this list of abusers, the most common were Volcarona and Keldeo, who, under the effects of weather, could manage to OHKO or 2HKO almost all opposing Pokémon. Volcarona had its immensely powerful 120BP Fire Blast under the sun (essentially 180 BP) along with its immensely powerful 120BP Hurricane under the rain (100% accurate). Keldeo had its immensely powerful 120 BP hydro pump and utility 80 BP scald (180BP and 120BP respectively under weather). Now, a newcomer may wonder why this was all so instrumental to the meta-game. The simple answer is that throughout this generation weather turns were endless, meaning that these abusers could run rampant through unprepared teams with relative ease. So, in a meta-game with one overly powerful play-style (weather), the meta-game soon became dull, as the same abusers were seen on every team. It is for these reasons the 5th generation was coined as the generation of <em>Weather Wars</em>.</p>

<p>I believe it’s also important to point out that a very game-changing move introduced in this generation was Scald. This move’s secondary affect is quite nasty, as it has a 30% chance to status your opponent with burn, which lowers your opponent’s attack by two stages and removes 12.5% of their health each turn. This was pretty game-changing, since it allowed many users of Scald (primarily water-types) to defeat Pokémon they were never meant to defeat. The classic example is Keldo vs Amoongus. Amoongus completely walls Keldeo (bar HP flying Keldeo), but with some pressure from residual damage from burn and entry hazards it would be worn down quite quickly. Also, most physical attackers had to be much more careful when facing users who carried Scald, as they would risk getting burned and put out of commission for the entire game. Scald’s introduction was likely the entry point for many users to realize the power of RNG based tactics.</p>

<p><img src="/images/megas.png" alt="Picture of all the mega evolutions" /> 
<em>Image of all the mega evolutions which were introduced to ORAS and XY</em></p>

<p>Pokémon XY/ORAS (6th generation) brought with it a slew of new game mechanics. These include: move adjustments, typing adjustments, critical-hit mechanics, weather mechanics, and, the most gaming changing of all, mega evolution. Several move adjustments were made, but I believe the most influential of these would have to be the change to Knock Off. Knock Off received a BP boost, which powered it up from 20BP to 65BP. This, in tandem with its new secondary effect, gave it a 50% BP boost if the opponent was holding an item. This brings Knock Off’s power to a frightening 97.5 BP. But the ride doesn’t stop there: this move became even more powerful due to the typing changes introduced. Game Freak decided that Dark and Ghost types moves had to deal neutral damage against Steel types. These changes, when combined, made the move Knock Off a low-risk, high-reward move, due to its very little resistances, high damage output, and niche in removing the opponent’s item. This change gave rise to Dark type Pokémon like Bisharp being commonly used, as they could take great advantage with their high base attack. Likewise, the other typing changes were game-changing as well. The new Fairy types managed to tame the offensive presence of Dragon-type Pokémon (Since Fairy-types are immune to Dragon-type moves). This new typing also breathed new life into Pokémon like Clefable, Mawile, and Azumarill, which gained impressive offensive and defensive capabilities.</p>

<p>Critical hits (one of the biggest momentum changers) received a buff in the form of frequency (15% chance instead of 7.5% chance) at only a minimal drawback of it dealing 1.5 times the normal damage instead of a 2.0 times. In retrospect, there is no real drawback, since most of the time all you need is a 1.5x boost to kill off an opponent considering how strong Pokémon are nowadays (I’m looking at all of you mega evolutions!).</p>

<p>Now, all these changes weren’t for the worst. In this generation, weather was nerfed and was restricted to 5 turns. This had a tremendous impact on the meta-game, since the representation of weather teams soon became scarce. Ultimately, this change allowed a more diverse array of teams to enter the meta-game.</p>

<p>It is finally time for the bitter sweet implications of the new game mechanics: mega evolution. Mega evolution is great in the fact that it gave spiced up old Pokémon and gave them fresh start. In most cases they made them a lot more viable in a certain aspect (think offense or defense). What I dislike about mega evolutions is the fact that it made several Pokémon too fast, too strong, too bulky, and in general into mindless sweepers. You can probably watch several replays where someone could lead off with a Charizard x, set up with a Dragon Dance then proceed to sweep their opponent’s team. This change resulted in an over-centralized meta-game where it’s mandatory to run your own mega Pokémon to be able to compete with your opponent. The only true <em>counter</em> for these fast and strong threats is Thunder Wave, as it drops their speed just enough so that your strong and fast Pokémon can defeat your opponent’s!</p>

<p><img src="/images/swagger.png" alt="AYE I GOT SWAGGER" class="center-image" /> <em>OP Anything Goes team for comedic relief</em></p>

<p>Now the time has come for my opinion on the current state of the Pokémon meta-game, specifically OU. But firsts lets step back and look of the state of the past meta-games. In the 4th generation the meta-game was balanced, fun, and thought-provoking but was somewhat stale, since there were limited Pokémon from which to create a unique team. The 5th generation adopted the mentality of fighting broken with broken, and consisted of many high-stakes match where one single mistake could cost you the whole game. Both of these meta-games were quite enjoyable, albeit both being quite stale due to variety. Then came the 6th generation, a meta-game so diverse that the chances of you having the same team as your opponent is practically 0. In this meta-game there are so many viable Pokémon that most matches are highly decided on team match-up since every mega evolution can tear a whole through an unprepared team with little ease. So how do we counter the new fast and strong mega evolutions the meta-game? By running your own mega of course! But wait there’s one more thing that almost every player has opted to start running. Yup, you guessed it: Thunder Wave. Since the meta-game is filled with so many fast and strong Pokémon, it’s impossible to have a universal check too; for the majority of them, the only solution is to rely on Thunder Wave, which offers speed control and complete paralysis.</p>

<p>Overall, the meta-game has come along way. We can see that it has had its ups and downs, and every generation had a small issue, be it from variety to broken game mechanics. But we can also see that the game has become more reliant on RNG-based mechanics to deal with threat; this displeases me, since I often see players simply going for these RNG-based tactics since they have no repercussions. However, what’s most infuriating is that sometimes players even choose these tactics over making plays that could win them the game. I can only hope that for Gen 7, Thunder Wave will not be as prevelant.</p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><category term="gaming" /><category term="Pokemon" /><category term="ORAS" /><category term="Overused" /><category term="Smogon" /><summary type="html"><![CDATA[Ever since the release of Pokémon ORAS (6th generation), I have seen the meta-game evolve in an unexpected way. This once intellectually-stimulating game has fallen from grace and has turned into a meta-game where everyone has decided that their main priority is to status their opponent’s Pokémon. This mentality has caused many players, in my experience, to make brain-dead plays/decisions in battles. This is likely because are no repercussions for doing so, unlike for other statuses like sleep (smogon sleep clause). But before I dive into this topic, how about we take a walk down memory lane and see how the previous generations led up to the current one?]]></summary></entry><entry><title type="html">Welcome!</title><link href="https://wgma.ca/blog/2014-10-30/first-post" rel="alternate" type="text/html" title="Welcome!" /><published>2014-10-30T00:00:00+00:00</published><updated>2014-10-30T00:00:00+00:00</updated><id>https://wgma.ca/blog/2014-10-30/first-post</id><content type="html" xml:base="https://wgma.ca/blog/2014-10-30/first-post"><![CDATA[<p>Welcome to my blog! I have recently decided to port over my blog from wgma00.me
to this site wgma.ca. Currently this blog is using the Jekyll, which makes the
writing blogs easier with markdown.</p>

<p>To kick things here is one of my favourite xkcd comics. It demonstrtes the
banter I have with some of my friends about the best editor for a “real programmer” (which is vim hands down).</p>

<p><img src="/images/real_programmers1.png" alt="https://xkcd.com/378/" />
<em>XKCD 376 - Real Programmers</em></p>]]></content><author><name>William Granados</name><email>me@wgma.ca</email></author><summary type="html"><![CDATA[Welcome to my blog! I have recently decided to port over my blog from wgma00.me to this site wgma.ca. Currently this blog is using the Jekyll, which makes the writing blogs easier with markdown.]]></summary></entry></feed>