<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Suhendry's Blog</title>
	<atom:link href="http://www.suhendry.net/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.suhendry.net/blog</link>
	<description>When in doubt, do math ;-)</description>
	<lastBuildDate>Thu, 17 May 2012 18:53:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Nim Game Example</title>
		<link>http://www.suhendry.net/blog/?p=1612</link>
		<comments>http://www.suhendry.net/blog/?p=1612#comments</comments>
		<pubDate>Sat, 14 Apr 2012 07:26:40 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[nim]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1612</guid>
		<description><![CDATA[As mentioned in my previous post, here I will give several example of impartial game which turn out to be exactly equivalent to Nim Game. Nimble Given a line of squares labeled 0, 1, 2, &#8230;. Several coins are placed on some squares (it&#8217;s possible to have more than one coin on a single square). <a href='http://www.suhendry.net/blog/?p=1612' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>As mentioned in my <a href="http://www.suhendry.net/blog/?p=1586">previous post</a>, here I will give several example of impartial game which turn out to be exactly equivalent to Nim Game.</p>
<p><br/><strong>Nimble</strong><br />
Given a line of squares labeled 0, 1, 2, &#8230;. Several coins are placed on some squares (it&#8217;s possible to have more than one coin on a single square). Two players take turns. One move consists of taking any one coin and moving it to any square to the left of it. It&#8217;s possible that the coin moved into a square already containing coins.<br />
<span id="more-1612"></span><fieldset class="spoiler">
			<legend>
				<input type="button" onclick="tiny_spoiler('solutionnbcxkdvpfe')" id="solutionnbcxkdvpfe_button" value="+" />
				solution
			</legend>
			<div id="solutionnbcxkdvpfe">This game is exactly a Nim Game where one coin in <i>k</i><sup>th</sup> square is a pile of <i>k</i> stones. Moving a coin from <i>k</i><sup>th</sup> square to its left is equivalent to removing stones from a pile of <i>k</i> stones in Nim Game.
			</div>
		</fieldset></p>
<p><br/><strong>Poker Nim</strong><br />
This game is played as a standard Nim Game, but players have option to either substracting stones (like in standard Nim Game) or adding more stones in a pile but not exceeding the original number of stones in that pile. To ensure the game termination, each player is allowed to add stones at most <i>k</i> (a finite number of) times.<br />
<fieldset class="spoiler">
			<legend>
				<input type="button" onclick="tiny_spoiler('solutiongmljnwpgne')" id="solutiongmljnwpgne_button" value="+" />
				solution
			</legend>
			<div id="solutiongmljnwpgne">If you already have a winning position in standard Nim Game, then when your opponent adds some stones to a pile, all you have to do is reverse your opponent&#8217;s move by removing the exact number of stones he/she added to that pile, thus restoring your winning position. Hence, this kind of game can be viewed as standard Nim Game.</p>
<p>Actually the &#8220;not exceeding the original number of stones in that pile&#8221; part is not neccesary in this game, one can have the same winning strategy despite of the number of stones added by the opponent.</p>
<p>This type of Nim Game where player can add stones is called <b>Bogus Nim</b>.
			</div>
		</fieldset></p>
<p><br/><strong>Turning Turtles</strong><br />
Given a horizontal line of N coins with some coins showing heads and some tails. Each turn, a player have to flip one coin from head to tail, and in the same time (if he/she wants), flip one more coin to the left of it.</p>
<p>For example, consider this sequence of N = 10 coins:</p>
<pre>1 2 3 4 5 6 7 8 9 10
T H T T H H T T T H</pre>
<p>Possible moves from this position are:</p>
<ul>
<li>Flip one coin from head to tail. Eg., coin in position 6 from head to tail.</li>
<li>Flip one coin from head to tail and flip another coin (from tail to head) to the left of it. Eg., coin in position 6 from head to tail and flip coin in position 3 from tail to head.</li>
<li>Flip one coin from head to tail and flip another coin (from head to tail) to the left of it. Eg., coin in position 6 from head to tail and flip coin in position 2 from head to tail.</li>
</ul>
<fieldset class="spoiler">
			<legend>
				<input type="button" onclick="tiny_spoiler('solutionthffahqjed')" id="solutionthffahqjed_button" value="+" />
				solution
			</legend>
			<div id="solutionthffahqjed">This game is equivalent to Nim Game with each coin showing head in <i>k</i><sup>th</sup> position equals to a pile of <i>k</i> stones.</p>
<ul>
<li>Flip one coin of position <i>k</i> from head to tail. This move is equivalent with removing all stones from a pile with <i>k</i> stones.</li>
<li>Flip one coin of position <i>k</i> from head to tail and flip another coin (from tail to head) to the left of it in position <i>t</i>. This move is equivalent with removing some stones from a pile with <i>k</i> stones leaving <i>t</i> stones in that pile.</li>
<li>Flip one coin of position <i>k</i> from head to tail and flip another coin (from head to tail) to the left of it in position <i>t</i>. This move is equivalent with removing some stones from a pile with <i>k</i> stones leaving <i>t</i> stones in that pile. Note that having two piles with a same number of stones is the same as having none of both piles, since if you already have a winning position and your opponent make a move on one of those identic piles, you can always reverse his/her move by moving on the other pile (remember <i>x</i> &oplus; <i>x</i> = 0).</li>
</ul>
<p>
			</div>
		</fieldset>
<p><br/><strong>Silver Dollar Game (without silver dollar)</strong><br />
This game is played on a line of squares labeled 0, 1, 2, &#8230; with several coins are placed in some square such that no two coins are placed in a same square. One move consists of moving one coin to its left onto any empty square and not passing any other coin. The game ends when a player cannot make any legal moves, since all the coins are jammed at the left-end of the strip.</p>
<p>For example, given these 4 coins in position {2, 5, 7, 10}:</p>
<pre>1 2 3 4 5 6 7 8 9 10 11
0 1 0 0 1 0 1 0 0  0  1</pre>
<p>Possible moves from this position is:</p>
<ul>
<li>Move coin in position 11 to position 10, 9 or 8.</li>
<li>Move coin in position 7 to position 6.</li>
<li>Move coin in position 5 to position 4 or 3.</li>
<li>Move coin in position 2 to position 1.</li>
</ul>
<fieldset class="spoiler">
			<legend>
				<input type="button" onclick="tiny_spoiler('solutionarecopgkel')" id="solutionarecopgkel_button" value="+" />
				solution
			</legend>
			<div id="solutionarecopgkel">The solution to this problem is a bit tricky.</p>
<p>We can think spaces between coins as pile. For example, if we have coins in position {2, 5, 7, 11}, then the gaps between coins are {1, 2, 1, 3}. Then moving a coin from position 7 to 6, is like removing one stone in 3<sup>rd</sup> pile. But then, that same move also increase the size of 4<sup>th</sup> pile by one stone. In other word, any stones removed from a pile will increase the size of its immediate right pile by the same size, except for the right most pile. This decomposition is not good, because the subgames are not independent (moving one pile could increase another pile). We should think another way to make this work.</p>
<p>The problem in above decomposition was with adjacent piles, so we can try to skip every second piles. In fact, this is the solution to this problem. From <b>right most pile</b>, skip every second piles, and take the remaining piles as piles in standard Nim Game. For example, coins in position {2, 5, 7, 11} will have piles {1, 2, 1, 3} and if we remove all second piles from the right most, we&#8217;ll get {2, 3}.</p>
<p>In the example above, coins in position 2 and 5 correspond to one pile of 2 stones, while coins in position 7 and 11 correspond to one pile of 3 stones.</p>
<ul>
<li>Moving coin in position 2 is equivalent with adding more stones to the respective pile (of 2 stones).</li>
<li>Moving coin in position 5 is equivalent with reducing stones from the respective pile (of 2 stones).</li>
<li>Moving coin in position 7 is equivalent with adding more stones to the respective pile (of 3 stones).</li>
<li>Moving coin in position 11 is equivalent with reducing stones from the respective pile (of 3 stones).</li>
</ul>
<pre>1 2 3 4 5 6 7 8 9 10 11
0 1 * * 1 0 1 * *  *  1</pre>
<p>Each * character represent the stone in each pile. So, this decomposition gives us a Bogus Nim (review the solution to Poker Nim), which can be viewed as a standard Nim Game.</p>
<p>But why from &#8220;right most pile&#8221;? If we remove every second stone from left most pile, we&#8217;ll leave the right most coin without any corresponding pile, which is bad, because it&#8217;s like allowing player to not make any move.
			</div>
		</fieldset>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1612</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nim Game</title>
		<link>http://www.suhendry.net/blog/?p=1586</link>
		<comments>http://www.suhendry.net/blog/?p=1586#comments</comments>
		<pubDate>Mon, 09 Apr 2012 10:08:02 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[nim]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1586</guid>
		<description><![CDATA[I&#8217;ll discuss a little bit about Nim Game. Felix said that he doesn&#8217;t understand about Nim Game so he asked me to write a blog. I don&#8217;t know whether he really doesn&#8217;t understand or he is just looking for a reason to make me write. Nim is a two player combinatorial/mathematical game strategy. Given a <a href='http://www.suhendry.net/blog/?p=1586' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><font color="#666666"><small>I&#8217;ll discuss a little bit about Nim Game. Felix said that he doesn&#8217;t understand about Nim Game so he asked me to write a blog. I don&#8217;t know whether he really doesn&#8217;t understand or he is just looking for a reason to make me write.</small></font></p>
<p>Nim is a two player combinatorial/mathematical game strategy. Given a number of piles which in each pile contains some numbers of stones. In each turn, player choose one pile and remove any number of stones (at least one) from that pile. In a normal play, player who cannot move is considered lose (ie., one who take the last stone is the winner). There is another variation where player who cannot move is considered as winning (misere play).<br />
<span id="more-1586"></span><br />
Nim game is an <strong>impartial game</strong>, which means the possible moves from any position are the same for each player. The only difference between two players is who move first. Chess, for example, is not an impartial game because one player play white pieces while the other play black pieces. According to <a href="http://en.wikipedia.org/wiki/Sprague%E2%80%93Grundy_theorem" target="_blank">this</a>, ANY impartial game can be transformed into a Nim game using Sprague-Grundy Theorem. So, solving a Nim game is essential to solve any impartial game. I&#8217;ll discuss about Grundy number in other time.</p>
<p>Fortunately, there is a simple winning formula for Nim game.</p>
<p style="border:1px solid black; padding: 10px 10px 10px 10px">Any position where the <a href="http://www.xcprod.com/titan/XCSB-DOC/binary_xor.html" target="_blank">xor</a> value of all piles is not zero is a winning position, otherwise it is a losing position. This xor value usually refered as <i>nim-sum</i>.</p>
<p>For example, let there be 5 piles of stones consisting: {2, 5, 1, 7, 3} stones respectively. The nim-sum of those piles are: 2 &oplus; 5 &oplus; 1 &oplus; 7 &oplus; 3 = 2, which is a winning position (who ever play first have a winning strategy). Another example, let there be 5 piles of stones consisting: {3, 5, 1, 4, 3} stones respectively. The nim-sum of those piles are: 3 &oplus; 5 &oplus; 1 &oplus; 4 &oplus; 3 = 0, which is a losing position (who ever play second have a winning strategy). When I said &#8220;winning strategy&#8221;, it means there is a strategy which ensure the winning of the respective player.</p>
<p>What is the reason behind that formula?</p>
<p>Here is the main idea. If the nim-sum is not zero, you always have at least one move which change the nim-sum into zero. In other hand, if the nim-sum is zero, you can only change it into a non-zero nim-sum. Note that the end game state (no stones) have a zero nim-sum. Which means, whoever is able to maintain the zero nim-sum for his/her enemy will win this game.</p>
<p>Let x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>n</sub> be the size of piles before a move, and y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n</sub> be the size of piles after a move. Let <i>s</i> = x<sub>1</sub> &oplus; x<sub>2</sub> &oplus; &#8230; &oplus; x<sub>n</sub> (ie., nim-sum before a move) and <i>t</i> = y<sub>1</sub> &oplus; y<sub>2</sub> &oplus; &#8230; &oplus; y<sub>n</sub> (ie., nim-sum after a move).</p>
<p>First we observe the relation between <i>s</i> and <i>t</i>. In this game a move consists of removing any number of stones (at least 1) from any one pile. Supposed the chosen pile is pile <i>k</i>, so x<sub>k</sub> is its previous number of stones in k<sup>th</sup>, y<sub>k</sub> is its number of stones after the move, and x<sub>k</sub> &ne; y<sub>k</sub> because we have to remove at least 1 stone, or to be precise, y<sub>k</sub> &lt; x<sub>k</sub>.</p>
<p>Notice that x &oplus; x = 0 and xor obeys associative and commutative laws.</p>
<pre>t = 0 &oplus; t
  = s &oplus; s &oplus; t
  = s &oplus; (x1 &oplus; ... &oplus; xn) &oplus; (y1 &oplus; ... &oplus; yn)
  = s &oplus; (x1 &oplus; y1) &oplus; ... &oplus; (xn &oplus; yn)
  = s &oplus; 0 &oplus; ... &oplus; 0 &oplus; (xk &oplus; yk) &oplus; 0 &oplus; ... &oplus; 0
  = s &oplus; xk &oplus; yk

t = s &oplus; xk &oplus; yk    (1)</pre>
<p>We will use (1) equation to proof the subsequence lemma.</p>
<p>Lemma 1. If <i>s</i> = 0, then <i>t</i> &ne; 0 no matter what the move is made.<br />
Proof: From (1) we can see that if s = 0, then any move will produce t &ne; 0 because x<sub>k</sub> &oplus; y<sub>k</sub> &ne; 0 (since x<sub>k</sub> &ne; y<sub>k</sub>).</p>
<p>Lemma 2. If <i>s</i> &ne; 0, then it always possible to make a move so <i>t</i> = 0.<br />
Proof: This following strategy will cause <i>t</i> = 0. Find <i>d</i>,the leftmost non-zero bit in binary representation of <i>s</i> and choose pile <i>k</i> (any pile) which <i>d</i><sup>th</sup> bit is also non-zero. Such <i>k</i> must exists, otherwise <i>d</i><sup>th</sup> of <i>s</i> must be zero. Then we can claim that y<sub>k</sub> &lt; x<sub>k</sub> for y<sub>k</sub> = <i>s</i> &oplus; x<sub>k</sub> since all bits to the left of <i>d</i> is the same in x<sub>k</sub> and y<sub>k</sub>, while the <i>d</i><sub>th</sub> bit is changed from 1 to 0, and the remaining right bits can only do at most 2<sup>d</sup>-1 changes.</p>
<pre>t = s &oplus; xk &oplus; yk
  = s &oplus; xk &oplus; (s &oplus; xk)
  = 0</pre>
<p>Thus the respective player can make a move by taking x<sub>k</sub> &#8211; y<sub>k</sub> stones from pile <i>k</i>.</p>
<p>This following example will ilustrate the strategy used in proof of lemma 2.</p>
<p>Let there be 5 piles which stones are: {18, 6, 3, 20, 9).</p>
<pre>18: 1 0 0 1 0
 6: 0 0 1 1 0
 3: 0 0 0 1 1
20: 1 0 1 0 0
 9: 0 1 0 0 1
------------- &oplus;
 <i>s</i>: 0 1 0 1 0</pre>
<p>The leftmost 1-bit of <i>s</i> lies in the 4<sup>th</sup>. Find any pile which 4<sup>th</sup> bit is 1, in our case, there&#8217;s only one: pile with 9 stones. Change the 4<sup>th</sup> bit of that pile (with 9 stones) into 0. Because of changing this 4<sup>th</sup> bit, we already ensure that the value of that pile will be less than its previous value (9) no matter what changes we&#8217;ll make in the remaining right bits. So, for the right bits, change all bit positions from 0 to 1 or vice-versa wherever it is 1 in <i>s</i> (we want to make <i>t</i> = 0).</p>
<pre>18: 1 0 0 1 0
 6: 0 0 1 1 0
 3: 0 0 0 1 1
20: 1 0 1 0 0
 3: 0 <font color="RED">0</font> 0 <font color="RED">1</font> 1
------------- &oplus;
 <i>t</i>: 0 0 0 0 0</pre>
<p>If the player always maintain <i>t</i> = 0 for his/her enemy, then at the end he/she will win this game as nim-sum for the end game (no stones) is zero.</p>
<p>I&#8217;ll discuss several example of impartial game which turn out to be Nim Game in the next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1586</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trip to Kuala Lumpur (ACM-ICPC 2011)</title>
		<link>http://www.suhendry.net/blog/?p=1540</link>
		<comments>http://www.suhendry.net/blog/?p=1540#comments</comments>
		<pubDate>Wed, 23 Nov 2011 19:34:47 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[Trip]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1540</guid>
		<description><![CDATA[Few weeks ago I went to Kuala Lumpur to attend ACM-ICPC 2011 Kuala Lumpur hosted by IIUM (International Islamic University Malaysia). I was invited as a problem setter and judge. The invitation was addressed to my previous campus (BINUS), thus I represented BINUS/Jakarta/Indonesia in this ICPC. All transportation and accomodation expenses are paid by the <a href='http://www.suhendry.net/blog/?p=1540' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Few weeks ago I went to Kuala Lumpur to attend ACM-ICPC 2011 Kuala Lumpur hosted by IIUM (International Islamic University Malaysia). I was invited as a problem setter and judge. The invitation was addressed to my previous campus (BINUS), thus I represented BINUS/Jakarta/Indonesia in this ICPC.</p>
<p><span id="more-1540"></span>All transportation and accomodation expenses are paid by the committee. I stayed at Lanson Place Ambassador Row, a four-star hotel located at Ampang. I got a very nice room, it has living/study room, bedroom, bathroom and kitchen. There&#8217;re two TVs, one in the living room and one in bedroom. There&#8217;re also microwave, water-heater, refrigerator and cutlery in the kitchen. Eko said that room was a &#8220;suit&#8221; type, I don&#8217;t know what it means.</p>
<p>The agenda for first day was judge meeting, so I came to IIUM (escorted by a committee) and met other judges. There are 3 judges who have already in the meeting room: Dr. Hossam El Gindy (chief), Marini Abu Bakar and Niko Ibrahim. Actually there is one more judge (Dr. Teddy Mantoro), but he said that he couldn&#8217;t attend judge meeting and practice session (icpc day-1). Hossam gave me a copy of problemset which will be used in the contest. I proposed two problems for this ICPC, apparently they&#8217;re put in problem B and G. I noticed one of the problem was exactly the same with a problem in ITBPC (one of Indonesia local contest), given an infinite size chessboard count the minimum step needed to move from one cell to another cell with knight move. I told Hossam about that problem and he agreed to withdraw the problem. Surprisingly, Marini also knew that problem from a Malaysia local contest, the more reason we should withdraw the problem. Hossam proposed another problem to substitute the withdrawn problem. Somehow I felt that I have encountered that new problem, but I couldn&#8217;t remember, so I just let it pass. We discussed the solution to the problem and I coded it.</p>
<p>Back to the hotel and I was hungry. Unfortunately, there&#8217;s not many choice for dinner. I went to a persian restaurant and ordered some kind of grilled chicken. They surely took a lot of time to prepare the food, but the food was okay.</p>
<p>The agenda for ICPC Day-1 was opening ceremony and practice session for contestants. Before opening ceremony, Hossam has setup PC2 for practice session. He decided to set the time-limit for each problem quite large and hid it from the contestants. When I asked him why we hid the time-limit, he said that he followed ICPC World Final. I don&#8217;t understand the reason behind this, but the time-limit was so generous, so I think it&#8217;s okay.</p>
<p>The trouble in practice session appeared after half hour elapsed time. Some teams begun to &#8220;test&#8221; the server and judge machines. They tested whether their codes will exceed the time-limit by doing a lot of iterations or even an infinite loop. Some teams also tested the stack size by doing recursion. In ICPC Jakarta I just let contestants did this, but in here the problem was: time-limit for each problem was large! There are 4 judges and all judge machines test contestant&#8217;s &#8220;solution&#8221; which consumed a lot of time (because it did a lot of iterations), and at one time I saw there&#8217;re more than 30 pending submissions. Hossam then decided that such submission is not allowed anymore, because it will obstruct &#8220;real&#8221; solution from other contestants.</p>
<p>After practice session I realized that judge machines are quite fast, so I suggested Hossam to decrease the time-limit for the contest proper. I also tested the brute-force solution for my two problems in judge machines and as I suspected they run quite fast, so I decided to decrease the time-limit more for my problems.</p>
<p>ICPC Day-2 was the contest proper. I wear ICPC shirt given by committee the day before, but Hossam did not, because he said his shirt was too small (yes, he has a big body).</p>
<p>The contest begun and there&#8217;re some submissions for easy problem. Strangely, they all got Wrong Answer. I doubt such easy problem could lead to many wrong answers, so I checked the contestants&#8217; output and compare them to judge&#8217;s output. I found the input which made the output different. At first I thought the contestants&#8217; were wrong, but then I realized that I looked at a wrong panel (I mixed up judge and contestant panel). Apparently there&#8217;s a bug in judge&#8217;s output. Hossam decided to remove that particular case (only 1 case) and rejudged the submissions. This happened very early in the contest so only a few teams knew about this.</p>
<p>Later there&#8217;re several reports about teams whose name in ranklist were wrong. Hossam investigated the problem and found the cause. It seems that all teams id are shifted by 3. To fix this the committee rename all teams manualy in PC2.</p>
<p>Before the contest begun, I said to Hossam that the problemset might be not hard enough for some strong teams. And I was right. Team +1 ironwood branch from National Taiwan University solved all the problems in just 3 hours, which made them the winner. And there are 3 more teams which solve all the problems in last hour.</p>
<p>The closing ceremony was quite simple but nice. There are two categories of champion, national and regional champion. The regional winners are:<br />
1. +1 ironwood branch, National Taiwan University.<br />
2. ETC, Fudan University.<br />
3. Dongskar Pedongi, Institut Teknologi Bandung.</p>
<p>I think Dongskar Pedongi will qualify to World Final as ETC is not from this sub-region.</p>
<p>Meanwhile, BINUS teams were not doing well. They only solved 3 and 4 problems (compared to the winner which solved 9 problems).</p>
<p>Well, that&#8217;s my story in ACM-ICPC Kuala Lumpur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1540</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ACM-ICPC INC 2011 &#8211; My Story</title>
		<link>http://www.suhendry.net/blog/?p=1523</link>
		<comments>http://www.suhendry.net/blog/?p=1523#comments</comments>
		<pubDate>Tue, 08 Nov 2011 08:43:52 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1523</guid>
		<description><![CDATA[Udah ada beberapa orang yang minta blog pembahasan soal ACM-ICPC INC 2011 yang barusan, tapi apa daya gw lagi ada kerjaan dan belum bisa buat. Paling cepat minggu depan, tapi kemungkinan besar masih dua-tiga minggu lagi setelah BNPC-HS 2011. Lagian gw juga harus nunggu Risan yang janji mau nulis pembahasan soal J (Messy Query) punya <a href='http://www.suhendry.net/blog/?p=1523' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Udah ada beberapa orang yang minta blog pembahasan soal ACM-ICPC INC 2011 yang barusan, tapi apa daya gw lagi ada kerjaan dan belum bisa buat. Paling cepat minggu depan, tapi kemungkinan besar masih dua-tiga minggu lagi setelah BNPC-HS 2011. Lagian gw juga harus nunggu Risan yang janji mau nulis pembahasan soal J (Messy Query) punya dia yang sepertinya memerlukan beberapa analisis yang cukup kompleks, dan Risan sendiri saat ini masih sibuk di Bandung untuk keperluan Pelatnas 1 TOKI dan minggu ini dia akan ke Kuala Lumpur untuk ACM-ICPC. Ya&#8230; ini emang bulan-bulan sibuk.</p>
<p>Lah terus ini post tentang apa? Di sini gw cuma mau post tentang cerita tentang pengalaman atau kejadian-kejadian unik yang gw alamin di INC kemarin aja. Mumpung masih segar dalam ingatan, kalau nunggu bulan depan udah keburu lupa. Nulis post ini cuma perlu waktu sekitar 1 jam (kalau pembahasan bisa satu hari). Tenang aja, pembahasan pasti dibuat, cuma ya minggu-minggu depan&#8230;</p>
<p><span id="more-1523"></span>INC 2011 adalah INC pertama gw dimana gw nggak di Jakarta, ho oh, seperti yang pak Freddy bilang di penutupan INC yang lalu, gw lagi di Singapore. Jadi banyak urusan gw di INC yang dikerjain ama Eko dan Timo, sekalian mereka belajar mana tau tahun depan bisa gw tinggal jadi gw cuma ngeset soal doank (tapi kayanya sih belum bisa).</p>
<p>Gw balik Jakarta dari Kamis malam, tiga hari sebelum INC, karena gw juga mau sekalian perpanjang KTP. Kalau Sabtu/Minggu kayanya kelurahan tutup sedangkan Senin gw harus ke Bandung buat Pelantas 1 TOKI, jadi mau ga mau deh. Tapi ternyata perpanjang KTP hari Jumat kemarin itu adalah kesalahan besar, komputer di kelurahannya rusak x( sia-sia gw datang dari pagi jam 9 dan nungguin mereka benerin satu hari yang akhirnya bilang &#8220;kayanya lama nih baru bener, ntar sore jam 4 baru balik ya&#8221;. Karena jam 5:30 gw ada janji mau ketemuan Fiona, yo wes tinggal, lupakan KTP.</p>
<h3>Preparation</h3>
<p>Satu hari sebelum INC (Sabtu) biasanya gw dan beberapa juri lain ngecek kesiapan sistem di ruang kontes (lab) sekaligus ngecek time-limit tiap soal di komputer kontes. Gw ga inget tahun-tahun sebelumnya gimana, tapi gw baru diingetin kalo ternyata praktikum mahasiswa masih berjalan jadi kita ga bisa pake ruang lab (doh!) siang hari. Padahal plan gw, pagi/siang beresin sistem INC, sore/malam kencan. Solusi: berdayakan Eko. Gw minta dia yang ngecek sistem dan tes time-limit sore-sore di lab.</p>
<p>Sabtu pagi gw ke BINUS, tepatnya ke Multiplus seberang kampus Anggrek, buat ngeprint dan fotokopi soal untuk practice session. Karena soal-soal ini telat masuk ke penggandaan (emang baru selesai disiapin Kamis/Jumat) jadi gw bilang ke Muhsin kalo gw yang akan kopi sendiri. Sebelum ke Multiplus gw ketemu Ricat di tengah jalan, dia mau kuliah kayanya. Pas nyampe Multiplus gw baru tahu&#8230; ternyata Multiplus seberang Anggrek udah bangkrut, gw buka pintunya, cuma ada batu-batu dan sampah <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' />  Haiyah, ya sudah, pindah ke fotokopi Daya, yang untungnya bisa ngeprint juga (sebelumnya gw taunya dia cuma bisa fotokopi aja).</p>
<p>Selesai fotokopi soal practice, gw mampir makan di Petojo (rumah makan Petojo sebelah Daya) dan pesan menu gw yang &#8220;biasa&#8221;: nasi putih + mie goreng. Selesai makan, gw ke ATM bentar di kampus, baru balik dari SG blum ngambil duit, pas nyeberang balik mo nyari taksi&#8230; gw ketemu rombongan 3 orang aneh yang manggil gw dan terus nyengir-nyengir: Eko, Winardi, Albert. Eko ngomel-ngomel protes bilang katanya gw ga bisa dateng mo pergi kencan, ya emang ga bisa, itu udah saatnya pergi, kan yang gw bilang ga bisa itu sore/malam <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  Selamat bekerja ya&#8230;</p>
<p>Malam sebelum INC kali ini ternyata gw masih beresin soal, tepatnya soal C punya Ilham. Sampe beberapa hari menjelang final, Ilham belum berhasil menyelesaikan codenya yang O(N^2 lg N), katanya ada masalah di implementasi salah satu bagian algonya. Untung udah bikin backup plan dengan menurunkan N di soal jadi 500 (sebelumnya 1000) dan siapin solusi O(N^3 lg N). Masalah di soal ini bukan cuma solusinya, tapi gimana cara generate testcasenya?? Random graph tentu ga akan bisa karena outputnya kemungkinan besar NO. Alhasil Risan dan Ilham akhirnya berhasil bikin generator graph buat soal ini. Ilham udah disain 40 jenis testcase, tapi karena dirasa masih kurang, ya udah ditambah 20 case lagi dari generator Risan (makanya soal C ada ralat soal T jadi 60). Yah, selesai beresin soal C udah jam 3:30 dan gw harus bangun jam 5:30, masih ada dua jam, mari tidur&#8230; sialnya gw udah guling-gulingan 1 jam masih ga bisa tidur! ya uda deh, ga usah tidur sekalian >.<</p>
<h3>D-Day</h3>
<p>Minggu pagi gw sampe ke lab jam 7:30, ternyata Aditya (ketua INC) udah mulai briefing ke anak-anak panitia yang lain. Gw langsung setup admin PC2 di lab, set user/pass dan upload semua data buat keperluan practice session. Kali ini kita pakenya PC2 versi 9.2 yang masih beta, soalnya 9.2 bisa ngubah output limit (ada satu soal rese yang outputnya >4M), sambil berharap gak ada masalah serius di 9.2. Kata Eko waktu itu dia pake pas penyisihan sih ga ada masalah.</p>
<p>Jam 8 peserta mulai datang (sebenarnya cuma 1 peserta aneh yang berencana kerja jadi cleaning service yang datang sebelum/tepat 8:00) dan registrasi ulang. Gw udah titipin ke yang jaga registrasi buat kumpulin team notebook peserta. Sekitar jam 8 lewat gw mendengar kabar yang super duper luar biasa mengejutkan: soal final terkunci di ruang akademis Syahdan. Udah gitu Building Management (BM) yang bisa dimintain buka ruang lagi ga ada katanya (nice). Di masa-masa panik gini si Ceemot minta gw print dan kopi ulang, masih ada dua jam harusnya sempat. Haih, ya wes, gw seret Eko dan ajak dia turun ke lantai 1 trus ke tempat fotokopi yang entah mana yang buka di hari Minggu. Pas di lantai 1 sebelum keluar dari gedung Anggrek, gw ngeliat protekom&#8230; tiba-tiba timbul ide, kenapa ga tanya mereka aja? Setelah tanya mereka, kita dialihkan ke basement tempat orang BM nongkrong soalnya katanya orangnya ada (lho). Lampu ruangnya sih nyala, tapi dikunci, ternyata orang yang jaga lagi makan, ya uda gw dikasi nomor hp si BM. Setelah gw telpon, ternyata dia juga udah ditelpon sama salah satu panitia, dan masalah udah beres. Beres? hmm&#8230; lega, tapi koq gw ga ditelpon/sms Ceemot buat cancel fotokopinya yah x( grrr&#8230;</p>
<p>Balik ke lantai 8 ngider-ngider sampai acara pembukaan di mulai. Gw bertugas ngasi technical briefing ke peserta pas pembukaan. Supaya lancar tentunya gw udah siapin slide buat mengcover apa aja yang mau gw sampein (meskipun pada akhirnya ada beberapa poin kecil yg kelupaan). Banyak pertanyaan dari peserta&#8230; ralat, banyak pertanyaan dari salah satu peserta (yang suka ngaku ganteng), pertanyaannya macam-macam dari yang normal sampai ga normal. Di sini gw juga sempat perkenalin beberapa problem setter, awalnya sih gw cuma mau mereka berdiri di tempat biar keliatan yang mana, tapi pak Freddy di depan gw bilang: &#8220;suruh maju aja su&#8221;. Yo wes >:) huahahaha, jangan salahkan saya kalian jadi panjangan <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Selesai briefing, gw ama juri-juri lain buru-buru ke ruang kontes peserta dan ngecek team notebook mereka, karena ternyata team notebook udah ditaro di meja masing-masing peserta, padahal belum dicek. Gak ada yang notebooknya bermasalah kecuali satu tim, dari BINUS <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /> , ya itu tim punya peserta aneh yang pengen jadi cleaning service tadi. Mereka ngasi dua tim notebook yang isinya beda sama sekali, jadi total 50 halaman <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /> </p>
<p>Gak lama kemudian peserta mulai masuk ke ruang kontes, gw sendiri buru-buru ke ruang juri dan start practice sessionnya. Beberapa masalah timbul pas practice session, sebagian besar berkaitan dengan printing. Ya karena gw ga ngerti ya gw serahkan aja ke aslab yang ngerti masalahnya di mana. Untuk printing sendiri, di babak practice session hasil print hanya diperlihatkan ke peserta tapi ga dikasi (ditarik lagi), supaya ga disimpan sebelum babak final.</p>
<h3>Crash</h3>
<p>10:30 practice session selesai, gw minta Surya reset server PC2 dan gw mulai siapin data buat babak final. Sebenarnya gw agak khawatir dengan babak final, soalnya total size testcase itu ~50M, gw udah wanti-wanti ke Eko (selaku pemilik salah satu soal yang inputnya gede) kalo hal ini bisa jadi masalah. Soalnya pas 2008 juga pernah kejadian model gini, PC2 nya berlaku aneh, dan akhirnya ketauan karena heap size PC2 nya kurang gede buat handle data banyak, tapi waktu itu juga ga sampe segini banyaknya. Selesai upload semua data, setting ini itu, juri udah ada yang mulai login, si Surya mau aktifin scoreboard PC2 nya. NAH! kejadian juga kan, server PC2 tiba-tiba crash, out of memory >.<</p>
<p>Kata si Eko dia udah gedein heap size JVM buat PC2 sampe 1G, ya gw bilang kurang. Tapi ternyata memory di server cuma 2G <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':-o' class='wp-smiley' /> , What?? Gawat, kalo digedein lagi servernya yang jadi matek ga punya memory. Ya udah coba gedein jadi 1.5G dulu dan liat apa yang terjadi, meanwhile gw ke ruang kontes dan umumin kalo kontes diundur. Musti gw umumin, soalnya aba-aba start contestnya pake timer yang ditampilkan pake proyektor infokus, jadi mereka bakal mulai sendiri kalo timernya abis. Setelah diset jadi 1.5G, gw upload ulang semua datanya, dan minta semua juri login, memori yang kepake udah 1G, padahal peserta belum login dan kontes belum jalan. Kemudian gw minta semua peserta login dulu, buat ngecek pemakaian memori nya di server, ternyata jadi > 1.2G. ughh&#8230; <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' />  tinggal 300M sisanya, dan gw gak tau behaviour server PC2 kalo kontes lagi jalan >.< Gak berani ambil resiko, kalo servernya crash di tengah kontes bakal repot. Ya udah akhirnya diambil keputusan, beberapa soal yang inputnya gede dipisah, ga diupload di server PC2, karena kebetulan soal-soal yang inputnya gede itu bukan soal gampang, jadi submissionnya bakal dikit. Trus judge soal input gede itu gimana? Kita bikin satu server PC2 bayangan lagi pake komputer lab, dan submission untuk soal-soal itu akan disubmit ulang ke server bayangan ini, jadi bebannya dibagi gitu. Kalaupun server bayangan crash, ga masalah, tinggal restart ulang (gak mempengaruhi jalannya kontes). Alhasil server PC2 yang buat kontes cuma makan sekitar 300M (ya iya lah), woh... lega, kontes mulai!!</p>
<h3>Contest Begins!</h3>
<p>5 menit pertama, belum ada submission&#8230; *sunyi senyap*, padahal tahun-tahun sebelumnya juri diserbu di awal-awal kontes dari soal bonusnya. Hehehe, gw emang akui tingkat kesulitan soal final tahun ini lebih tinggi dari tahun sebelumnya, termasuk soal bonusnya. Terutama soal bonus kali ini emang sengaja dipilih yang emang gampang, tapi codingnya nggak 1-2 menit. Untuk soal bonusnya malah gw udah kasi &#8220;bocoran&#8221; pas briefing, jadi sebenarnya bisa skip langsung baca input-output dan coding <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Submission pertama datang dari Saklar Lhompat (UI) untuk soal B di menit 11, yang tentunya AC. Submission kedua dari Apis Volan (BINUS) juga untuk soal B di menit 13. Gak lama kemudian satu per satu tim mulai mengirim submission, tapi ritmenya lambat banget, kalau gw perhatiin rata-ratanya 1.5 submission per menit. Dongskar (ITB) gimana? mereka ternyata ngehajar soal H duluan, yang adalah soal termudah kedua, baru sehabis itu mereka babat soal B. Setelah satu jam berlalu, peringkat satu (kalau ga salah) diraih sementara oleh Vidina (UI) dengan jumlah solve 3, kalo di ICPC Jakarta tahun-tahun lalu satu jam udah 5-6 soal <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> . Vidina lumayan juga, karena setau gw anggotanya itu anak-anak semester baru semua.</p>
<p>Mendekati 1.5 jam, Dongskar submit soal E sebagai soal ketiga mereka, dan AC! Ruang juri langsung rame, soalnya E itu bukan soal yang termasuk bonus atopun medium. Buka source codenya, ga ngerti dia coding apa, close lagi. Ternyata tingkah laku Dongskar yang AC di soal E ini membuat beberapa tim &#8220;tertipu&#8221; ikut-ikutan ngerjain soal E. Sempat gw perhatiin di scoreboard, untuk soal E 6 tim di bawah Dongskar semuanya merah-merah, cuma ijo sendiri di paling atas. Gw bilang &#8220;tertipu&#8221; karena banyak soal lain yang lebih solvable daripada soal E, seperti soal A, F dan I.</p>
<p>Lewat 1.5 jam (kira-kira) belum banyak perubahan dan gw mulai ngantuk, maklum dua hari berturut-turut tidurnya kurang banget, terutama hari sebelumnya ga tidur.  Juri yang lain sepertinya bisa menangani kejadian-kejadian yang bakal muncul, jadi ya udah gw tidur bentar di ruang juri, dengan berbagai pose, yang diabadikan oleh Eko Buluk. Pas gw lagi tidur di kursi si Fiona dateng, akhirnya nyampe, dia abis gereja dan baru sempet ke BINUS. Ya gw bangun, dan *masih* ga banyak perubahan. Ada beberapa klarifikasi yang mostly ga penting (cuma ga baca soal dengan teliti). Gak lama kemudian gw menghilang selama satu jam, makan siang, si Eko sempat beberapa kali sms/nelpon karena ada klarifikasi, yang seperti gw bilang tadi, itu gara-gara ga baca soal dengan teliti.</p>
<p>Balik ke ruang juri, yang leading masih Dongskar dengan total solve 6, dan tim kedua solve cuma 3, gilak, dua kali lipat >.< Dongskar solve 6 sih udah gw antisipasi, tapi tim lain cuma solve 3 itu ga gw expect, apa mungkin gara-gara "tertipu" soal E tadi ya. Gak lama kemudian Saklar Lhompat menyusul AC juga di soal E setelah sebelumnya sempat fail satu kali, jadi mereka sementara di tempat kedua dengan solve 4.</p>
<p>1 jam menjelang akhir kontes, scoreboard freezed, balon stop. Apis Volan, tim unggulan dari BINUS baru solve 3! Muhsin (kepala lab computing) udah stress ngeliatin scoreboard <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Tapi dalam masa freeze ini, ternyata mereka melakukan sesuatu yang mengagetkan semua yang ada di ruang juri, mereka solve 3, soal E, I dan A! Si Muhsin dan Ceemot langsung girang joged-joged. Bipartite, tim kedua dari BINUS juga ternyata berhasil menyelesaikan soal F (yang emang menurut gw ga susah), dan berhasil naik ke rank 4. Saklar Lhompat dilain pihak, ga melakukan submission apa-apa selama 1 jam terakhir, katanya mereka ngebug di satu soal, entah bug apaan.</p>
<p>Menjelang akhir kontes, juri tiba-tiba diserang dengan spam, terutama dari TePeBe (ITB) dan Vanaheimr (BINUS). Yang TePeBe emang submission ga jelas, sedangkan Vanaheimr kayaknya desperate submission (18 submission fail semua). Yang jadi problem adalah soal E itu judgenya di server bayangan, jadi juri yang ngejudge Vanaheimr itu rada kerepotan (belum selesai dijudge udah masuk submission baru untuk soal yang sama dari tim yang sama).</p>
<h3>End</h3>
<p>Kontes berakhir dan sesuai dugaan awal dimenangkan oleh Dongskar Pedongi (ITB) dengan solve 7, di tempat kedua adalah Apis Volan dengan solve 6, dan di tempat ketiga adalah Saklar Lhompat dengan solve 4. Pas di practice session gw sempat broadcast klarifikasi kalo sesi pembahasan setelah kontes ditiadakan. Ya jelas. 16:00 bubar kontes, 16:00 mulai pembahasan, gw belum lulus dari ujian ninja, belum bisa bunshin no jutsu. Selesai kontes, juri (terutama gw) belum bisa langsung keluar dari ruangan, karena perlu cek dan rekap beberapa data, jadi impossible gw bisa langsung ke hall begitu kontes selesai. Selain itu gw juga yakin abis bubaran kontes para peserta pasti masih ngobrol-ngobrol dan ngabisin snack yang ada, bakal susah disuruh naik ke hall.</p>
<p>Penutupan diawali dengan kata sambutan/penutup? dari pak Freddy, sehabis itu gw membacakan daftar pemenang, dimulai dari honorable mention (solve >= 2), rank 18 (solve >= 3) dan naik sampai ke rank 1. Di sertifikat peserta yang non 3 besar semua tertulis honorable mention, soalnya itu pre-printed sebelum kontes. Ga keburu kalo semua diprint ranknya setelah kontes. Mungkin bisa diusul untuk tahun depan sertifikat rank-nya dikirim aja ke univ yang bersangkutan.</p>
<p>Bubar acara, saatnya memalak yang dapet duit. Thanks buat Ricky dan Hudi atas traktirannya di Petojo <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  <font color="WHITE">Reinhart dilupakan&#8230;</font><br />
Huahahahahahaha&#8230; <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1523</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ACM-ICPC INC 2011 &#8211; Qualification Round</title>
		<link>http://www.suhendry.net/blog/?p=1490</link>
		<comments>http://www.suhendry.net/blog/?p=1490#comments</comments>
		<pubDate>Mon, 24 Oct 2011 19:51:10 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1490</guid>
		<description><![CDATA[Babak penyisihan dari ACM-ICPC Indonesia National (Programming) Contest, atau yang biasa disebut INC, baru saja berlangsung pada hari Minggu, 23 Oktober 2011 yang lalu. INC 2011 adalah bagian dari rangkaian kegiatan ACM-ICPC 2011 (diakui oleh ACM sebagai salah satu kontes lokal ICPC), namun bukan sebagai kontes regional, sehingga tidak ada slot yang dialokasikan bagi tim <a href='http://www.suhendry.net/blog/?p=1490' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Babak penyisihan dari ACM-ICPC Indonesia National (Programming) Contest, atau yang biasa disebut INC, baru saja berlangsung pada hari Minggu, 23 Oktober 2011 yang lalu. INC 2011 adalah bagian dari rangkaian kegiatan ACM-ICPC 2011 (diakui oleh ACM sebagai salah satu kontes lokal ICPC), namun bukan sebagai kontes regional, sehingga tidak ada slot yang dialokasikan bagi tim pemenang untuk mengikuti ICPC World Final 2012 (untuk tim yang ingin mendapatkan kesempatan ini harus mengikuti ICPC Regional di kota/negara lain seperti Kuala Lumpur, Manila, dll).</p>
<p>Tahun sebelumnya Universitas Bina Nusantara dipercaya untuk menjadi host salah satu regional site ICPC (ICPC Jakarta), namun tahun ini direktur ICPC Asia menginginkan ICPC Jakarta dirotasi (&#8220;gantian&#8221;) dengan site-site lain, sehingga ICPC Jakarta tahun ini tidak ada (sambil berharap tahun depan kembali ada).</p>
<p><span id="more-1490"></span>Karena tidak ada ICPC Jakarta, maka Universitas Bina Nusantara kembali menyelenggarakan INC sebagai kontes pemrograman tingkat nasional menggunakan sistem yang sama persis dengan ICPC dan terdiri dari dua babak, yaitu: penyisihan (online) dan final (onsite).</p>
<p>Di post ini saya akan memberikan pembahasan dari soal-soal penyisihan yang baru saja berlalu, sekaligus sedikit membahas mengenai beberapa kendala yang dihadapi peserta pada babak penyisihan.</p>
<p>Soal ACM-ICPC INC 2011 &#8211; Qualification Round dapat dilihat di <a href="http://www.suhendry.net/contest/inc11/qual/">sini</a>.</p>
<p>Scoreboard babak penyisihan bisa dilihat di <a href="http://competition.binus.ac.id/inc/Competition/index.php?page=ScoreBoard" target="_blank">sini</a> (kalau linknya mati artinya pathnya sudah berubah, akan saya update nanti).</p>
<p>Data uji sengaja tidak dirilis namun kalian bisa mencoba soal ini (nanti) di <a href="http://tokilearning.org/" target="_blank">tokilearning.org</a> karena data uji aslinya akan saya upload di sana.</p>
<p>Eko Wibowo (salah satu juri) juga sudah menulis blog tentang babak penyisihan yang lalu, postnya bisa dibaca di <a href="http://marcadian.wordpress.com/2011/10/23/feedback-penyisihan-inc-2011/" target="_blank">sini</a>.</p>
<p>Pembahasan untuk masing-masing soal bisa dilihat di:<br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=2">A – Frog in a Bus</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=3">B – The Yellow Dungeon</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=4">C – Divisor Game</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=5">D – Counting Different Bits</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=6">E – Rearranging Boxes</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=7">F – 1D Array Multiplication</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=8">G – Time Zone Conversion</a><br />
<a href="http://www.suhendry.net/blog/?p=1490&#038;page=9">Lain Lain</a></p>
<p><font color="green"><strong>Kalau mau comment atau bertanya mengenai soal tertentu, tolong disebutkan soal mana yang dimaksud (comment di post ini semuanya digabung).</strong></font></p>
<div class="page-links"><strong>Pages:</strong> <span class="page-num">1</span> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=2"><span class="page-num">2</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=3"><span class="page-num">3</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=4"><span class="page-num">4</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=5"><span class="page-num">5</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=6"><span class="page-num">6</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=7"><span class="page-num">7</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=8"><span class="page-num">8</span></a> <a href="http://www.suhendry.net/blog/?p=1490&#038;page=9"><span class="page-num">9</span></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1490</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Compfest 2011 (Mahasiswa) – Final</title>
		<link>http://www.suhendry.net/blog/?p=1474</link>
		<comments>http://www.suhendry.net/blog/?p=1474#comments</comments>
		<pubDate>Mon, 27 Jun 2011 18:05:08 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1474</guid>
		<description><![CDATA[Babak final programming Compfest 2011 tingkat perguruan tinggi baru aja berlalu. Juara pertama diraih oleh ITB (Dongskar Pedongi &#8211; RevolutiO(N)), juara kedua oleh BINUS (Ketua Compfest), dan juara ketiga oleh UGM (ein). Yang patut diperhatikan, juara keempat itu dari BINUS juga (Pelopor Compfest), isinya hanya 1 orang: Winardi Kurniawan, dia dikhianati dua anggota timnya (Panji <a href='http://www.suhendry.net/blog/?p=1474' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Babak final programming Compfest 2011 tingkat perguruan tinggi baru aja berlalu. Juara pertama diraih oleh ITB (Dongskar Pedongi &#8211; RevolutiO(N)), juara kedua oleh BINUS (Ketua Compfest), dan juara ketiga oleh UGM (ein).</p>
<p>Yang patut diperhatikan, juara keempat itu dari BINUS juga (Pelopor Compfest), isinya hanya 1 orang: Winardi Kurniawan, dia dikhianati dua anggota timnya (Panji Kharisma dan Eko Mirhard) :p. Tapi bersyukur juga Panji ga ikut, kalau Winardi sendiri AC 7, tapi kalau Winardi + Panji kayaknya jadi AC 5 [-(</p>
<p>Ok, di sini gw mau kasi pembahasan <b>singkat</b> tentang soal-soal yang keluar. IMO, soal-soalnya ga susah, tapi ga ada satupun tim yang solve semua soal (pada mentok di soal E).</p>
<p>Soal bisa didownload di <a href="http://www.suhendry.net/contest/compfest11/compfest2011-mahasiswa-final.pdf" target="_blank">sini</a>.</p>
<p>Scoreboard bisa dilihat di <a href="http://compfest.cs.ui.ac.id/public/finalpcmahasiswa.html" target="_blank">sini</a> (tapi sepertinya link ini ga permanen).</p>
<p><span id="more-1474"></span></p>
<p><b>A. Segiempat Terluas</b><br />
Ini soal paling mudah. Luas maksimum bisa dibentuk oleh persegi (bujur sangkar), jadi solusinya tinggal (L/4)<sup>2</sup>.</p>
<p>Heran, koq soal kayak gini perlu 10 menit..?</p>
<p><b>B. Pelat Terbalik</b><br />
Angka 9 hanya bisa dipakai kalau ada angka 6, begitu juga sebaliknya. Kita mau membuat palindrome dengan angka-angka itu (9 dipasangkan dengan 6). Tinggal proses dari angka 9 sampai angka 0 (descending) dan cek apa angka itu (dan pasangannya) bisa dipake atau ngga. Kalau bisa tambahkan angka itu dari depan dan pasangannya dari belakang.</p>
<p><b>C. Gajah Catur</b><br />
Untuk mengecek berapa poin yang bisa didapatkan dengan meletakkan gajah di sebuah petak kita memerlukan iterasi O(N), dan total terdapat N<sup>2</sup> petak (N &le; 1000), sehingga algoritma bruteforce naif O(N<sup>3</sup>) tidak bisa digunakan di sini (akan mendapatkan Time Limit Exceed).</p>
<p>Seandainya yang ingin diletakkan bukan gajah, tapi benteng (bisa bergerak horizontal/vertikal tapi tidak diagonal), maka soal ini tentu jadi lebih mudah bukan? Hitung jumlah poin untuk setiap baris dan setiap kolom. Kemudian uji di semua petak berapa poin yang bisa didapatkan dari petak itu. Ini bisa dilakukan dalam O(1). Misalkan posisi yang mau diuji adalah (r,c), maka total poin = sumrow[r] + sumcol[c] &#8211; 2 * value[r][c]. Total kompleksitasnya O(N<sup>2</sup>).</p>
<p>EDIT: corrected 2 * value[r][c], thank to Jonathan Irvin Gunawan.</p>
<p>Sekarang bagaimana untuk soal ini (gajah)? Putar saja papannya 45 derajat. Jadi sebagai ganti sumrow dan sumcol, kita akan mendapatkan sumdiag1[] (diagonal kiribawah-kananatas) dan sumdiag2[] (diagonal kiriatas-kananbawah).</p>
<p>Note: Bukan beneran diputar 45 derajat ya, maksudnya &#8220;lihat&#8221;nya begitu. Masalah detil implementasinya coba dipikirin.</p>
<p><b>D. Lho?</b><br />
Ya&#8230; just do it aja, ga susah, semua peserta juga bisa.</p>
<p><b>E. Jalan-Jalan</b><br />
Tidak ada satupun tim yang berhasil menyelesaikan soal ini, jadi jelas ini soal yang paling sulit di kontes kali ini.</p>
<p>Sama seperti penyisihan, solusi soal tersulit kali ini juga menggunakan matrix exponentation.</p>
<p>Pikirkan dulu formula dp-nya:</p>
<p>f(a,b,m): ada berapa banyak path untuk mencapai goal dengan K langkah di mana sekarang kita berada di node a dan sebelumnya berada di node b dan sudah melangkah tepat m kali.</p>
<p>f(a,b,m) = jumlah f(c,a,m+1) untuk semua c = a..h dan c != b.</p>
<p>Jika formula di atas dimasukkan ke dalam matrix, tentunya parameter m tidak perlu kita ikutkan. Masih ada a dan b? Ya masukin aja semua&#8230;</p>
<p>Matrixnya jadi kira-kira gini:</p>
<p>[ f(a,a,1), f(a,b,1), f(a,c,1), ..., f(b,a,1), ..., f(h,g,1), f(h,h,1) ]</p>
<p>Trus pikirin matrix transisinya, supaya kalau dikaliin hasilnya jadi:</p>
<p>[ f(a,a,2), f(a,b,2), f(a,c,2), ..., f(b,a,2), ..., f(h,g,2), f(h,h,2) ]</p>
<p>Node di graphnya kan cuma ada 8, total statenya jadi cuma ada 8*8 = 64, kecil. Jadi matrix awalnya 1 x 64 dan matrix transisinya 64 x 64. Sisanya tinggal urusan permatrixan.</p>
<p><b>F. Robot Pos</b><br />
Soalnya ga jelas =.=. Awalnya gw kira kota awal dan tujuannya itu berupa titik, tapi setelah baca contoh input, sepertinya yang dimaksud kota itu adalah garis. Intinya, robotnya mulai dari sisi kiri menghadap ke sisi kanan, pertanyaanya adalah apakah si robot bisa mencapai sisi kanan yang jauhnya infinite.</p>
<p>Kunci untuk mencapai sisi kanan ada pada aturan ke-3: &#8220;Jika pada suatu waktu ia diperintahkan sekaligus belok kiri dan kanan, robot tersebut akan tetap melaju lurus tanpa belok.&#8221;</p>
<p>Coba perhatikan contoh input 3: 30 dan 22.</p>
<p>Si robot akan bergerak lurus (karena aturan ke-3) pada saat menempuh jarak ke 330. Ketika mencapai jarak 330, si robot sudah belok kiri sebanyak 330/30 &#8211; 1 = 10 kali, dan belok kanan sebanyak 330/22 &#8211; 1 = 14 kali. Setelah berbelok ke kiri sebanyak 10 kali dan ke kanan sebanyak 14 kali, maka si robot akan menghadap ke arah kota tujuan, dan kemudian dia akan bergerak lurus karena aturan ke-3, sebelum ia mulai berbelok-belok lagi. Dengan demikian perlahan-lahan si robot akan bergerak ke arah kota tujuan.</p>
<p>Ringkasnya, Jika selisih jumlah belok ke kiri dan ke kanan sebelum robot bergerak lurus adalah kelipatan 4, maka jawab Ya, jika tidak jawab Tidak.</p>
<p>EDIT: Setelah dipikir-pikir lagi&#8230; ternyata jika jawabannya Ya dan robot itu mulai dari posisi (x,y) menghadap ke kanan maka semua posisi dari (x,y), (x+1,y), (x+2,y), &#8230;, (INF, y) itu bisa divisit <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' />  Jadi kalo kotanya berupa titikpun ga masalah, keren juga ini soal&#8230;</p>
<p><b>G. Arsitek Perumahan</b><br />
Secara intuitif kan bisa kepikir kalau cost minimum itu bisa didapatkan dari deret yang terurut (contohnya sengaja kasi ga sorted supaya misleading). Jadi yang perlu dilakukan pertama kali adalah sort datanya, O(N lg N). Kemudian u/ setiap h[i], cari pasangannya h[j] sedemikian sehingga h[j] &#8211; h[i] &le; M dan j adalah maksimal. Gimana cara mencarinya? binary search. Total O(N lg N).</p>
<p><b>H. Si A, Si B, Si C II</b><br />
Pertama, urutkan dulu {X, Y, Z}. Penjelasan berikut mengasumsikan X &lt; Y &lt; Z.</p>
<p>Partisi rentang bilangan 1..Z menjadi 3 bagian:<br />
a: 1..X<br />
b: X+1..Y<br />
c: Y+1..Z</p>
<p>Kita definisikan f(p,q,r) adalah jumlah triplet di mana orang pertama menggunakan rentang p, orang kedua menggunakan rentang q dan orang ketiga menggunakan rentang r.</p>
<p>Rentang a bisa dipakai 3 kali, rentang b hanya 2 kali, sedangkan rentang c hanya bisa 1 kali. Jumlahkan saja semua kombinasi penggunaan rentangnya.</p>
<p>ANS = f(a,a,a) * 1 + f(a,a,b) * 3 + f(a,a,c) * 3 + f(a,b,b) * 3 + f(a,b,c) * 6</p>
<p>f(a,a,b) dikali 3 karena ada 3 kombinasi untuk f(a,a,b) yaitu : f(a,a,b), f(a,b,a) dan f(b,a,a). Begitu juga yang lainnya.</p>
<p>Jika X &le; Y dan/atau Y &le; Z (seperti di contoh 1 dan 2), tinggal disesuaikan saja cara di atas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1474</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Segment Array</title>
		<link>http://www.suhendry.net/blog/?p=1461</link>
		<comments>http://www.suhendry.net/blog/?p=1461#comments</comments>
		<pubDate>Wed, 01 Jun 2011 21:49:40 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Algorithm]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1461</guid>
		<description><![CDATA[Here I want to explain something called segment array (I&#8217;m not sure whether the term is correct), a data structure that no better than segment tree but simpler to code. I learned this structure from my friend, Timotius Sakti, when he was still an undergraduate and preparing for ICPC. I used this structure to solve <a href='http://www.suhendry.net/blog/?p=1461' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Here I want to explain something called segment array (I&#8217;m not sure whether the term is correct), a data structure that no better than segment tree but simpler to code. I learned this structure from my friend, Timotius Sakti, when he was still an undergraduate and preparing for ICPC.</p>
<p>I used this structure to solve problem H on Jollymoo 11 (a local &#8220;practice&#8221; contest at BINUS University). The problem was originated from Codeforces &#8211; Yandex Algorithm 2011 Round 1 Problem D, &#8220;Sum of Medians&#8221;, which can also be solved by segment tree.</p>
<p><span id="more-1461"></span><br />
Problem: supposed you want to create a data structure that serves these operations:</p>
<ul>
<li>ADD x, add x into the set, assuming x is not in the set.</li>
<li>DEL x, remove x from the set, assuming x is already in the set.</li>
<li>COUNT a b, return the number of elements x which is between a and b, inclusive.</li>
</ul>
<p>Let x be between 1 and 100,000. If x is larger than that but the distribution is sparse, you should &#8220;normalize&#8221; the data first into 1..P where P is the number of distinct x.</p>
<p>Those who have learnt segment tree should recognize this problem as it can simply be solved by a segment tree structure. Yes it does, but here I want to show another structure that can also solve this problem.</p>
<p>First, create a &#8220;square&#8221; array to contain all the number. By &#8220;square&#8221; I mean if N is 100,000 then you should create an array of ~400 x ~400. Actually it&#8217;s not necessarily a square (you can go with 300 x 500, etc) but square is the ideal size.</p>
<p>Let the array size be M x M and let&#8217;s call it ARR[1..M][1..M]. Note that I use 1-based index array, you should make any necessary change in following explanation to meet your need.</p>
<p>We will use ARR[1] to store all values between 1 and M, ARR[2] to store all values betwen M+1 and 2M, ARR[3] to store all values between 2M+1 and 3M, and so on. I&#8217;ll call ARR[1..M] as slots. You can just declare each element as a boolean value because we only need to know whether there is an element of that value.</p>
<p>We also need an array of integer of size M, let&#8217;s call it NUM[1..M]. We will use NUM[c] to store the number of elements that are currently exists in slot ARR[c].</p>
<p>For each ADD x query, we need to do this:</p>
<ul>
<li>Find the appropriate slot for x (eg. if M is 400 and x is 900, the slot might be ARR[3]).</li>
<li>Turn on the flag on ARR&#8217;s element which corresponds to x (eg. ARR[3][100] for x = 900 and M = 400).</li>
<li>Recalculate NUM of that slot (eg. NUM[3]).</li>
</ul>
<p>You can see that NUM[c] at any time will always hold the number of elements in slot ARR[c].</p>
<p>In this problem, ADD query is O(1). Finding the appropriate slot is easy, turning the flag on is also easy, recalculating NUM is also trivial (just increase its value by one). In another problem, ADD query might need more process (as in &#8220;Sum of Median&#8221;).</p>
<p>For each DEL x query, do the similar things as in ADD query (turn off the flag and recalculate NUM).</p>
<p>For each COUNT a b query, we need to do this:</p>
<ul>
<li>Find the appropriate slot for a and b.</li>
<li>Iterate in slot a from element which correspond to a to M (the end), count the number of existing elements.</li>
<li>Iterate in slot b from 1 (the beginning) to the element which correspond to b, count the number of existing elements.</li>
<li>Iterate NUM from slot a+1 through slot b-1, sum the number of existing elements.</li>
</ul>
<p><img src="http://www.suhendry.net/blog/wp-content/uploads/2011/06/segment-array.gif" alt="" title="segment-array" width="250" height="293" class="alignnone size-full wp-image-1463" /></p>
<p>COUNT query is O(sqrt(N)) as we need to iterate through at most M elements.</p>
<p>As you can conclude, this structure need O(sqrt(N)) for each query, worse than segment tree which need O(lg(N)), but it&#8217;s simpler to code for you who are not familiar with segment tree.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1461</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Jollymoo 11</title>
		<link>http://www.suhendry.net/blog/?p=1451</link>
		<comments>http://www.suhendry.net/blog/?p=1451#comments</comments>
		<pubDate>Wed, 01 Jun 2011 20:13:13 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1451</guid>
		<description><![CDATA[Minggu, 29 Mei 2011 yang lalu barusan Jollymoo 11 berlalu. Tingkat kesulitan Jollymoo 11 adalah normal (bukan untuk divisi 2 seperti Jollymoo 10), jadi ada beberapa soal yang cukup menantang. Di sini gw mau bahas soal-soalnya, dan semoga bisa ngasi sedikit pencerahan buat yang ga bisa. Anyway, karena ini bukan kontes untuk divisi 2, maka <a href='http://www.suhendry.net/blog/?p=1451' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Minggu, 29 Mei 2011 yang lalu barusan Jollymoo 11 berlalu. Tingkat kesulitan Jollymoo 11 adalah normal (bukan untuk divisi 2 seperti Jollymoo 10), jadi ada beberapa soal yang cukup menantang. Di sini gw mau bahas soal-soalnya, dan semoga bisa ngasi sedikit pencerahan buat yang ga bisa. Anyway, karena ini bukan kontes untuk divisi 2, maka beberapa penjelasan gw akan singkat banget, karena gw anggap trivial dan lu orang (harusnya) bisa.</p>
<p>Soal-soal Jollymoo 11 bisa dilihat di <a href="http://www.suhendry.net/contest/jollymoo11/" target="_blank">SINI</a>.</p>
<p>Soal-soal kontes ini beberapa diambil dari arsip kontes-kontes lama (SRM, Codeforces, dll) yang diubah dan disiapkan, jadi gw ga ngambil credits apapun untuk soal-soal yang ada.</p>
<p><span id="more-1451"></span></p>
<p><b>A. Po Memungut Bola</b><br />
Mula-mula formulasikan dulu soal ini ke dalam bentuk:</p>
<p>f(S) = <sub>i=1..N, j=1..N, i and j not in S</sub> min{ f(S U i U j) + cost[0][i] + cost[i][j] + cost[j][0] }</p>
<p>S: himpunan yang berisi bola-bola yang sudah dikumpulkan.<br />
f(S): jarak minimum yang diperlukan untuk mengumpulkan semua bola yang tidak ada di dalam himpunan S.<br />
U: union, gabungan.<br />
cost[a][b]: jarak dari a ke b.<br />
0: posisi awal Po.</p>
<p>Perhatikan bahwa i bisa sama dengan j, yang artinya hanya 1 bola yang diambil. Tentunya himpunan di atas bisa direpresentasikan ke dalam bitmask karena N maksimal hanya 20, sehingga formula di atas bisa kita implementasikan ke dalam dynamic programming. Berapa kompleksitasnya? Ada sebanyak 2<sup>N</sup> state dan untuk menghitung sebuah state diperlukan iterasi N<sup>2</sup> sehingga total kompleksitas waktunya adalah O(N<sup>2</sup> . 2<sup>N</sup>). Solusi ini masih TLE.</p>
<p>Solusi di atas bisa kita optimisasi dengan ide seperti ini: Seandainya terdapat 4 bola: a, b, c dan d; urutan pengambilan a-b dan c-d (ambil a dan b, kemudian ambil c dan d) akan menghasilkan total jarak yang sama dengan urutan c-d dan a-b. Dengan ide ini, kita bisa menghilangkan salah satu iterasi (i) dan cukup melakukan iterasi pada j (pilih satu bola sembarang dan iterasi pasangannya). Dengan demikian total kompleksitas yang diperlukan menjadi O(N . 2<sup>N</sup>).</p>
<p>Note: hanya perlu menambahkan satu line &#8220;break;&#8221; di solusi yang O(N<sup>2</sup> . 2<sup>N</sup>).</p>
<p><b>B. Bilangan K-Prima</b><br />
Ada beberapa yang menyelesaikan soal B dengan bar-bar, iterasi dari 1..N dan cari ada berapa bilangan yang k-prima. Setiap bilangan diuji k-primanya dengan iterasi akar n. Solusi ini cukup ok, tapi karena time-limitnya hanya 1 detik, solusi ini pasti dapat TLE (tanpa optimasi).</p>
<p>Pertama, hitung dulu (precompute) faktor bilangan prima terbesar dari setiap bilangan dari 1..MAXN (100.000). Ini bisa dilakukan dengan modifikasi algoritma sieve.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> f<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100005</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> maxn<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span> <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> f<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;=</span> maxn<span style="color: #008080;">;</span> j <span style="color: #000040;">+</span><span style="color: #000080;">=</span> i <span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
      f<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Code di atas ada iterasi dua tingkat tapi kompleksitasnya bukan O(N<sup>2</sup>), tapi hanya O(N lg N). Mengapa? ada hubungannya dengan harmonic series.</p>
<p>Berikutnya, untuk setiap query tinggal looping dari 1..N dan hitung ada berapa bilangan yang memenuhi k-prima.</p>
<p><b>C. Gaji Perusahaan</b><br />
Rasanya soal ini nggak susah, tinggal DP sederhana aja.</p>
<p><b>D. Putar dan Berputar</b><br />
Soal ini bisa diartikan begini: diberikan sebuah directed graph dimana setiap node hanya memiliki sebuah out-degree, cari path terpanjang yang tidak melewati edge yang sama dua kali.</p>
<p>Tentunya graph tersebut bisa memiliki cycle, jadi kita terlebih dahulu harus mencari semua cycle yang ada pada graph tersebut. Jika semua cycle sudah didapatkan, sisanya mudah.</p>
<p><b>E. Himpunan Bilangan Pembagi</b><br />
Soal ini juga nggak susah, ada banyak approach yang bisa dipakai buat menyelesaikan soal ini, salah satunya adalah DP. Bisa juga diselesaikan dengan menghitung jumlah faktor prima dari N.</p>
<p>Contoh, 72 = 2<sup><b>3</b></sup> * 3<sup><b>2</b></sup>, sehingga total ada (3 + 2) + 1 bilangan yang lebih kecil dari N yang habis membagi N dan bilangan itu juga habis dibagi bilangan yang lebih kecil.</p>
<p>72 = 2<sup>3</b></sup> * 3<sup>2</sup><br />
24 = 2<sup>3</b></sup> * 3<sup>1</sup><br />
8 = 2<sup>3</b></sup> * 3<sup>0</sup><br />
4 = 2<sup>2</b></sup> * 3<sup>0</sup><br />
2 = 2<sup>1</b></sup> * 3<sup>0</sup><br />
1 = 2<sup>0</b></sup> * 3<sup>0</sup></p>
<p>EDIT: Yang terakhir seharusnya 2<sup>0</b></sup> * 3<sup>0</sup>, tadinya 2<sup>0</b></sup> * 3<sup>2</sup>. Thanks to William.</p>
<p><b>F. Interval</b><br />
Hanya ada 4 jenis output yang mungkin, yaitu:</p>
<ul>
<li>Tidak ada interval yang overlap, jika demikian output semua interval.</li>
<li>Tidak ada interval yang demikian, output -1.</li>
<li>Ada satu interval yang demikian.</li>
<li>Ada dua interval yang demikian.</li>
</ul>
<p>Keempat kemungkinan output tersebut sudah diberikan di contoh input, jadi seharusnya tidak ada yang terkena &#8220;tricky case&#8221; di soal ini.</p>
<p>Untuk menyelesaikan soal ini, kita perlu mengetahui berapa interval yang bisa diambil maksimal sedemikan sehingga tidak ada interval yang saling overlap. Jika kita mengetahui ini, maka interval yang tidak diambil itu adalah interval yang akan menyebabkan overlap.</p>
<p>Mula-mula urutkan data interval yang ada berdasarkan R (end) secara menaik, dan ambil interval satu per satu namun interval tersebut tidak boleh overlap dengan interval-interval yang sudah diambil. Mirip dengan interval selection problem kan?</p>
<p>Jika dari proses di atas didapatkan tidak ada interval yang tidak diambil, maka output semua interval. Jika ada dua atau lebih interval yang tidak diambil, maka output -1. Jika hanya ada satu interval yang tidak diambil, kita harus memeriksa bagaimana interval ini overlap dengan interval yang lain. Jika interval ini hanya overlap dengan satu interval lain, maka output interval ini dan interval yang overlap itu (dua angka), tapi jika interval ini overlap dengan dua atau lebih interval lain, maka output hanya interval ini (satu angka).</p>
<p><b>G. Koleksi Perangko</b><br />
Soal mudah. Jual semua perangko yang pak Janggut punya dan beli lagi perangko-perangko dari harga yang paling murah.</p>
<p><b>H. Jumlah Data Terurut</b><br />
Sepertinya ini soal yang paling sulit yang ada di Jollymoo 11. Felix Halim berhasil AC di soal ini, TAPI solusi dia seharusnya masih TLE. Test case yang gw generate untuk soal ini emang ga terlalu kuat, cuma random aja, gw akan generate case criticalnya dan reupload casenya ntar.</p>
<p>Soal ini bisa diselesaikan dengan segment array (gw jelasin di post lain deh) atau segment tree. Solusi segment tree sebenarnya baru kepikiran beberapa hari yang lalu setelah kontes selesai.</p>
<p>Solusi segment tree:<br />
Range bilangan input bisa mencapai 1 miliar, tapi jumlah angka yang berbeda tidak akan lebih dari N, oleh karena itu kita perlu &#8220;normalisasi&#8221; dulu data-datanya. Caranya? baca dulu semua input dan simpan angka apa saja yang muncul. Ubah angka-angka itu jadi dari 0..X, di mana X adalah jumlah bilangan berbeda yang muncul.</p>
<p>Gunakan segment tree untuk menangani setiap query insert/delete/sum. Setiap node di segment tree perlu menyimpan dua informasi ini:</p>
<ul>
<li>Banyaknya bilangan yang ada di subtree node tersebut.</li>
<li>SUM[0..4] dari subtree tersebut.</li>
</ul>
<p>SUM[0] adalah jumlah semua bilangan kelima dimulai dari index-0: 0, 5, 10, 15, &#8230;<br />
SUM[1] adalah jumlah semua bilangan kelima dimulai dari index-1: 1, 6, 11, 16, &#8230;<br />
SUM[x] adalah jumlah semua bilangan kelima dimulai dari index-x: x, x+5, x+10, &#8230;</p>
<p>Jika kita ingin menghitung SUM[2] dari sebuah node, maka kita hanya perlu menjumlahkan SUM[2] dari node kiri dan SUM[p] dari node kanan, di mana p adalah index yang sesuai dengan jumlah node yang ada di subtree kiri. Misalnya di subtree kiri ada 2 node, maka di subtree kanan kita memerlukan SUM[0] untuk menghitung SUM[2] dari parentnya.</p>
<p>KIRI  KANAN<br />
[a b] [<b>c</b> d e f]</p>
<p>c adalah index-0 dari subtree kanan, sehingga untuk menghitung SUM[2] dari parent node, kita perlu menjumlahkan SUM[2] dari node kiri (yang nilainya 0) dan SUM[0] dari node kanan.</p>
<p><b>I. Tikus Pintar</b><br />
Ga banyak yang bisa dijelasin, BFS/DFS aja, graphnya kan berupa tree jadi harusnya ga susah.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1451</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Compfest 2011 (Mahasiswa) &#8211; Penyisihan</title>
		<link>http://www.suhendry.net/blog/?p=1431</link>
		<comments>http://www.suhendry.net/blog/?p=1431#comments</comments>
		<pubDate>Sun, 22 May 2011 18:49:25 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1431</guid>
		<description><![CDATA[Seperti tahun-tahun sebelumnya Universitas Indonesia (UI) mengadakan event IT bernama Compfest yang di dalamnya berisi berbagai kegiatan dan perlombaan. Namun khusus tahun ini (semoga tahun-tahun berikutnya juga), Compfest juga mengadakan perlombaan di bidang programming (problem solving) untuk tingkat mahasiswa. Babak penyisihan Compfest mahasiswa barusan berlalu, ada 5 soal, 4 mudah dan 1 &#8220;susah&#8221; (susah buat <a href='http://www.suhendry.net/blog/?p=1431' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Seperti tahun-tahun sebelumnya Universitas Indonesia (UI) mengadakan event IT bernama Compfest yang di dalamnya berisi berbagai kegiatan dan perlombaan. Namun khusus tahun ini (semoga tahun-tahun berikutnya juga), Compfest juga mengadakan perlombaan di bidang programming (problem solving) untuk tingkat mahasiswa.</p>
<p>Babak penyisihan Compfest mahasiswa barusan berlalu, ada 5 soal, 4 mudah dan 1 &#8220;susah&#8221; (susah buat yang baru belajar). Kemarin gw dapat link scoreboardnya, tapi sekarang scoreboardnya udah berubah jadi untuk kategori SMA. Sepertinya link itu cuma temporer, jadi ga gw cantumin di sini (karena ntar bisa ilang juga). Hasilnya, sekitar 20an tim berhasil solve 4, tidak ada tim yang solve 5. Dari BINUS kalau ga salah ada 4 tim yang lolos ke final, dan ada satu tim veteran yang memalukan (termalas #1 + termalas #2 + manusia-normal) =.=</p>
<p>Dari kemarin gw ditanyain solusi soal D (soal yang ga ada yang bisa solve di kontes), jadi gw kepikiran untuk bikin write-up penyisihan Compfest mahasiswa yang barusan lewat. Soal D ini emang rada lain sendiri ngelihat soal-soal lain yang tingkat kesulitannya jauh banget sama soal D <img src='http://www.suhendry.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Soal penyisihan mahasiswa bisa dilihat di <a href="http://www.suhendry.net/contest/compfest11/compfest2011-mahasiswa-penyisihan.pdf" target="_blank">sini</a>.</p>
<p><span id="more-1431"></span></p>
<p><b>A. Bayar atau Kabur</b><br />
Soal bonus? Kalau ga bisa, coba belajar solve soal-soal mudah dari online judge dulu.</p>
<pre>printf( "%d\n", (s[0] == 'b' ? X : 0) - L * R * J );</pre>
<p><b>B. Kalimat Logika</b><br />
Mula-mula pisahkan elemen-elemen dalam kalimat input berdasarkan karakter &#8216;^&#8217;. Karena di soal ini hanya ada karakter konjugasi (&#8216;^&#8217;) maka soal ini menjadi mudah untuk diselesaikan. Seperti yang kita ketahui, jika ada salah satu elemen bernilai S, maka nilai kebenaran kalimat tersebut pasti salah.</p>
<p>Dengan demikian kita hanya perlu memeriksa apakah ada elemen yang bernilai S atau ~B. Jika ada, maka output &#8220;salah&#8221;. Jika tidak ada, kita harus memeriksa apakah ada elemen yang berupa variable, jika ada maka output &#8220;mungkin&#8221;, jika tidak maka output &#8220;benar&#8221;. Kalimat yang memiliki variable tidak mungkin memiliki output &#8220;benar&#8221; karena kita tidak bisa membuat tautologi hanya dengan operasi konjugasi (&#8216;^&#8217;) dan negasi (&#8216;~&#8217;).</p>
<p><b>C. Titik dan Garis</b><br />
Kurang ngerti apa yang dimaksud soalnya dengan &#8220;titik&#8221;. Apakah hanya titik yang berada di sisi/sudut persegi, atau titik yang timbul karena perpotongan garis di dalam persegi juga dihitung. Tapi kalau dilihat dari contoh input/outputnya, sepertinya pemahaman yang kedua yang benar.</p>
<p>Setiap penambahan sebuah garis yang ke-k, bisa menambah jumlah titik sebanyak k+1, yaitu k-1 titik yang timbul dari perpotongan dengan k-1 garis sebelumnya, dan 2 titik yang terletak di sisi persegi.</p>
<p>Soal ini juga tidak menyebutkan berapa batasan input untuk N, hanya disebutkan berupa &#8220;bilangan bulat&#8221; (10<sup>100</sup> kan juga bilangan bulat). Tapi kalau kita asumsikan inputnya muat dalam integer (32 bit), maka solusinya bisa dibruteforce (coba tambahkan garis satu per satu), karena jumlah garis yang dibutuhkan tidak akan lebih dari akar dari N.</p>
<p>EDIT: ternyata batasan input ada tertulis di soal (di bagian problem description, bukan bagian input :p). N maksimum hanya 1 miliar, artinya muat di dalam integer 32 bit.</p>
<p><b>D. Coin Change Deluxe</b><br />
Sepertinya ini soal yang paling sulit di penyisihan Compfest 2011 untuk tingkat mahasiswa (tidak ada tim yang berhasil menyelesaikannya). Pas baca soal ini sebenarnya langsung kepikiran solusinya, tapi jadi bingung koq ga ada tim yang berhasil solve? (lumba-lumba ITB mana? si ricat mana?) Belakangan baru tahu ternyata itu lumba-lumba ga ikutan. Si ricat? patut dipertanyakan dia ngapain aja x(.</p>
<p>Untuk solve soal ini, kita <b>harus sudah bisa dynamic programming (DP) dan perkalian matrix</b>.</p>
<p>Bagi yang sudah bisa DP, tentu bisa langsung berpikir bagaimana formula DP nya.</p>
<pre>f(X) = f(X-M<sub>1</sub>) + f(X-M<sub>2</sub>) + ... + f(X-M<sub>N</sub>)</pre>
<p>Dengan kompleksitas space O(X) dan kompleksitas time O(X.N).</p>
<p>Karena X bisa mencapai 1 miliar, tentu solusi DP di atas tidak mencukupi. Solusi lainnya? Matrix Exponentation. Topik ini pernah saya bahas (sekilas) di <a href="http://www.suhendry.net/blog/?p=902" target="_blank">sini</a>, coba dipelajari kalo belum pernah belajar.</p>
<p>Kalau diperhatikan, formula DP di atas itu mirip dengan formula Fibonacci. Jadi kita bisa menyelesaikan soal ini dengan membangun matrix berukuran 32 x 32 (karena M maksimal adalah 32) dan mengisinya dengan nilai-nilai yang diperlukan untuk perhitungan perkalian matrixnya.</p>
<p>Contoh,</p>
<p>misalnya hanya ada 2 jenis koin yaitu 2 dan 5, maka formula DP kita adalah:</p>
<pre>f(X) = f(X-2) + f(X-5)</pre>
<p>Sehingga kita bisa membuat matrix:</p>
<pre>0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
0 0 1 0 1
0 0 0 1 0</pre>
<p>Note: matrix di atas gw perkecil jadi 5 x 5 untuk mempermudah gambarnya aja, aslinya 32 x 32.</p>
<p>Sekarang coba perhatikan perkalian dua matrix berikut:</p>
<pre>
<sub>     </sub>              0 0 0 0 1
<sub>     </sub>              1 0 0 0 0
(f<sub>0</sub> f<sub>1</sub> f<sub>2</sub> f<sub>3</sub> f<sub>4</sub>) * 0 1 0 0 0  =  (f<sub>1</sub> f<sub>2</sub> f<sub>3</sub> f<sub>4</sub> f<sub>0</sub>+f<sub>3</sub>)
<sub>     </sub>              0 0 1 0 1
<sub>     </sub>              0 0 0 1 0</pre>
<p>Sesuai formula DP kita, f<sub>0</sub>+f<sub>3</sub> adalah f<sub>5</sub>. Dengan demikian matrix A (f<sub>0</sub> f<sub>1</sub> f<sub>2</sub> f<sub>3</sub> f<sub>4</sub>) jika dikalikan dengan matrix B (matrix transisi) akan menghasilkan matrix A&#8217; (f<sub>1</sub> f<sub>2</sub> f<sub>3</sub> f<sub>4</sub> f<sub>5</sub>), yang jika dikalikan lagi dengan matrix B akan menghasilkan matrix (f<sub>2</sub> f<sub>3</sub> f<sub>4</sub> f<sub>5</sub> f<sub>6</sub>) dan seterusnya.</p>
<p>Nilai dari f<sub>0</sub> adalah 1 dan f<sub>i=1..32</sub> bisa digenerate dengan DP. Sedangkan untuk i=33..X, kita selesaikan dengan matrix di atas.</p>
<p>Perkalian matrix bersifat asosiatif, artinya A * B * B = (A * B) * B = A * (B * B). Dengan demikian kita bisa menghitung solusi kita dengan A * B<sup>X</sup>, di mana A adalah matrix awal/hasil (yang kiri) dan B adalah matrix transisi (yang kanan). Mengalikan dua buah matrix memerlukan kompleksitas O(s<sup>3</sup>) di mana s adalah ukuran matrix (di sini adalah 32), dan menghitung pangkat p<sup>X</sup> memerlukan kompleksitas O(lg X) dengan divide and conquer, sehingga total kompleksitas time yang diperlukan untuk menyelesaikan soal ini adalah O(s<sup>3</sup> . lg X).</p>
<p><b>E. Sakla Lhompa</b><br />
Beberapa analisa diperlukan untuk menyelesaikan soal ini.</p>
<p>Jumlah langkah yang diperlukan oleh Sakla dan Lhompa adalah sama. Seandainya bidak Sakla dan Lhompa bisa menempati tempat yang sama (bidak yang datang belakangan tidak mendapat giliran tambahan), maka tentu saja Sakla akan selalu menjadi pemenang (karena Sakla jalan duluan). Jadi jika Lhompa ingin menang, ia harus mendapatkan &#8220;loncatan extra&#8221; dari bidak Sakla.</p>
<p>Lhompa hanya bisa mendapatkan loncatan extra <b>jika dan hanya jika jumlah langkah minimum yang diperlukan untuk mencapai tujuan adalah genap</b>. Bayangkan jika papannya berukuran 1 x 5, maka diperlukan 4 lompatan untuk mencapai tujuan (ada 3 petak yang berada di antara Sakla dan Lhompa). Karena Lhompa selalu mendapat giliran kedua, maka petak tengah yang merupakan &#8220;pertemuan Sakla dan Lhompa&#8221; pasti dimasuki dahulu oleh Sakla, yang artinya Lhompa bisa mendapatkan giliran tambahan di petak itu. Kondisi ini bisa digeneralisasi menjadi papan berukuran N x M (selalu ada strategi untuk Lhompa agar mendapatkan giliran tambahan jika jumlah langkah yang diperlukan adalah genap), dengan demikian kita hanya perlu memeriksa apakah (N &#8211; 1) + (M &#8211; 1) adalah bilangan genap atau ganjil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1431</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Jollymoo 10 (Div 2)</title>
		<link>http://www.suhendry.net/blog/?p=1420</link>
		<comments>http://www.suhendry.net/blog/?p=1420#comments</comments>
		<pubDate>Tue, 17 May 2011 06:28:46 +0000</pubDate>
		<dc:creator>suhendry</dc:creator>
				<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://www.suhendry.net/blog/?p=1420</guid>
		<description><![CDATA[Jollymoo 10 yang dibuat khusus untuk pemula (divisi 2) baru saja berlalu dan gw mau bahas soal-soalnya di sini supaya bisa jadi bahan buat belajar. Yang bikin soal untuk Jollymoo 10 ini antara lain gw sendiri, Felix Perdana, Hutomo, Oscar Yuandinata dan Petrus Risan. Soal-soalnya bisa dilihat di sini. Tentang Peserta Pembahasan Soal Pages: 1 <a href='http://www.suhendry.net/blog/?p=1420' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Jollymoo 10 yang dibuat khusus untuk pemula (divisi 2) baru saja berlalu dan gw mau bahas soal-soalnya di sini supaya bisa jadi bahan buat belajar. Yang bikin soal untuk Jollymoo 10 ini antara lain gw sendiri, Felix Perdana, Hutomo, Oscar Yuandinata dan Petrus Risan.</p>
<p>Soal-soalnya bisa dilihat di <a href="http://www.suhendry.net/contest/jollymoo10/" target="_blank">sini</a>.</p>
<ul>
<li><a href="http://www.suhendry.net/blog/?p=1420&#038;page=2">Tentang Peserta</a></li>
<li><a href="http://www.suhendry.net/blog/?p=1420&#038;page=3">Pembahasan Soal</a></li>
</ul>
<div class="page-links"><strong>Pages:</strong> <span class="page-num">1</span> <a href="http://www.suhendry.net/blog/?p=1420&#038;page=2"><span class="page-num">2</span></a> <a href="http://www.suhendry.net/blog/?p=1420&#038;page=3"><span class="page-num">3</span></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.suhendry.net/blog/?feed=rss2&#038;p=1420</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

