<?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>Записки программиста &#187; Олимпиады</title>
	<atom:link href="http://arti.kz/category/olympiads/feed" rel="self" type="application/rss+xml" />
	<link>http://arti.kz</link>
	<description></description>
	<lastBuildDate>Fri, 17 Jun 2011 03:56:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Разбор задач 3-го этапа Республиканской олимпиады школьников</title>
		<link>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be</link>
		<comments>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be#comments</comments>
		<pubDate>Sun, 17 May 2009 15:26:35 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=930</guid>
		<description><![CDATA[Олимпиада прошла давно, но немного времени для разбора нашлось только сейчас. Архив олимпиады (задачи, тесты и решения) можно найти где обычно. Задача А. Мухи Задача является вариацией довольно известной математической задачи. Главное &#8211; понять, что каждая муха всегда будет двигаться строго к соседке. В этом случае скорости мух всегда будут направлены друг к другу под [...]]]></description>
			<content:encoded><![CDATA[<p>Олимпиада прошла давно, но немного времени для разбора нашлось только сейчас. Архив олимпиады (задачи, тесты и решения) можно найти <a title="Архив 3-го этапа Республиканской олимпиады 2009" href="http://olympiads.kz/node/192">где обычно</a>.</p>
<h3>Задача А. Мухи</h3>
<p>Задача является вариацией довольно известной математической задачи. Главное &#8211; понять, что каждая муха всегда будет двигаться строго к соседке. В этом случае скорости мух всегда будут направлены друг к другу под одним углом, а рассматривая движение с точки зрения какой-то из мух, можно заметить, что на расстояние между ней и соседкой влияет ее скорость и проекция скорости соседки на прямую, содержащую скорость этой мухи. В результате получим, что время, через которое мухи встретятся равно T = D / (V + V cos(? &#8211; 2 ? / N)). Ну а расстояние, которое пройдет каждая из мух, легко вычисляется по магической формуле: S = VT = D / (1 + cos(? &#8211; 2 ? / N)).</p>
<h3>Задача B. Числа</h3>
<p>Из-за небольших ограничений задачу можно было решать множеством разных способов. Один из них &#8211; воспользоваться довольно стандартным приемом в таких задачах. Сначала немного преобразуем задачу: посчитаем, сколько раз будет выписана каждая цифра от 1 до 9, а затем посчитаем сумму. Заметим, что F(A, B, Y) = F(1, B, Y) &#8211; F(1, A &#8211; 1, Y), где A, B &#8211; границы интервала, а Y &#8211; цифра, количество которой считается. Теперь научимся считать F(1, X, Y). Для этого сначала предподсчитаем D[N] = F(1, 10^N &#8211; 1, 1). Это несложно делается по рекуррентному соотношению D[N] = D[N - 1] * 10 + 10 ^ (N &#8211; 1). Далее нужно разложить X на цифры и считать количество чисел с заданным префиксом, который нужно перебирать. Здесь проще привести код:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">i64 count<span style="color: #008000;">&#40;</span>i64 x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	i64 result <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
		a<span style="color: #008000;">&#91;</span>n<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> x <span style="color: #000040;">%</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
		x <span style="color: #000040;">/</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000040;">&amp;</span>gt<span style="color: #008080;">;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> t <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</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> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<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> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				<span style="color: #000040;">++</span>t<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			result <span style="color: #000040;">+</span><span style="color: #000080;">=</span> D<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				<span style="color: #000040;">--</span>t<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #000040;">++</span>t<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	result <span style="color: #000040;">+</span><span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><span id="more-930"></span></p>
<h3>Задача C. Опасный маршрут</h3>
<p>Один из вариантов решения &#8211; использовать алгоритм Краскала для построения остовного дерева. Уберем из графа все ребра и будем добавлять их обратно в порядке увеличения стоимости. Как только образуется путь из вершины 1 в вершину N &#8211; следует остановиться и вывести стоимость последнего добавленного ребра.</p>
<h3>Задача D. Горки</h3>
<p>В этой задаче также существует множество подходов. Ну а то, что в качестве ответа нужно вывести только сумму высот, добавляется множество алгоритмов, строящих неправильную последовательность, но дающих правильную сумму. Вот один из подходов. Главная проблема в этой задаче &#8211; это наличие одинаковых элементов в количестве превышающем (N + 1) / 2. Если таковых элементов нет, то всегда можно построить N / 2 горок с N / 2 наибольшими числам в качестве высот. Если же такие элементы есть, то нужно действовать хитрее. Допустим, что наиболее часто встречающееся число равно K. Если имеются числа, большие K, то используем их в качестве высот горок из двух элементов, один из которых будет равен K. Поместим эти горки в начале последовательности. В оставшейся части также будем строить горки из двух элементов (пока это возможно), но наибольшим элементом в каждой из них будет уже K.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k <span style="color: #000040;">!</span><span style="color: #000080;">=</span> m<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> i <span style="color: #000080;">=</span> MAXN<span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> k<span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			b<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
			<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			b<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
			<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> r <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</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;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> k<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</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>r <span style="color: #000080;">&lt;</span> l<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		b<span style="color: #008000;">&#91;</span>r<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
		<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r <span style="color: #000080;">&lt;</span> l<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		b<span style="color: #008000;">&#91;</span>r<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<h3>Задача E. Синоптики</h3>
<p>Также несложная задача на использование стека. Пройдем по последовательности слева направо и будем выполнять следующие действия для каждого числа: вытащим из стека все числа, меньшие текущего числа, а затем добавим это число. При этом, число на верхушке стека перед добавлением нового числа будет указывать на искомый день.</p>
<h3>Задача F. Телепорт</h3>
<p>Построим граф, определяемый условием задачи. При этом в качестве стоимости ребер, означающих маршруты дирижаблей, положим стоимости этих билетов на эти дирижабли, а в качестве стоимости ребер между планетами возьмем большое число, например, 10^6. Затем запустим на этом графе обычный алгоритм Дейкстры. Понятно, что наилучший путь будет использовать как можно меньше переходов между планетами из-за их большой стоимости. Пусть в результате получено число X, тогда количество переходов между планетами будет равно X / 10^6, а стоимость маршрута &#8211; X % 10^6.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Разбор задач 2-го этапа Республиканской олимпиады школьников</title>
		<link>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be</link>
		<comments>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be#comments</comments>
		<pubDate>Thu, 22 Jan 2009 15:41:24 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=671</guid>
		<description><![CDATA[На прошлой неделе буквально одновременно с V Международной Жаутыковской олимпиадой прошел 2-й этап Республиканской олимпиады школьников, для Алматы являющийся районным. Задачи были довольно несложные, но для полного решения требовалась некоторая сообразительность. Условия задач, тесты к ним и решения как всегда можно найти в правильном месте. Задача A. Окружность Во-первых, будем считать, что A1 &#60; B1 [...]]]></description>
			<content:encoded><![CDATA[<p>На прошлой неделе буквально одновременно с <strong>V Международной Жаутыковской олимпиадой</strong> прошел<strong> 2-й этап Республиканской олимпиады школьников</strong>, для Алматы являющийся районным. Задачи были довольно несложные, но для полного решения требовалась некоторая сообразительность. <strong>Условия задач</strong>, <strong>тесты</strong> к ним и <strong>решения</strong> как всегда можно найти в <a title="Архив II этапа Республиканской олимпиады 2009 года" href="http://olympiads.kz/node/179">правильном месте</a>.</p>
<h3>Задача A. Окружность</h3>
<p>Во-первых, будем считать, что A1 &lt; B1 и A2 &lt; B2 (если это не так, то добьемся этого поменяв числа в соответствующей паре местами). Далее, нарисовав один-два случая можно заметить, что хорды будут пересекаться или касаться только в трех случаях:</p>
<ul>
<li>они совпадают, то есть обе вершины общие:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>B1 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
<li>одна вершина общая:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">==</span> B1<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
<li>вершины разные, и для каждой хорды выполняется следующее условие: если окружность разрезать по этой хорде, то вершины другой хорды должны быть в разных частях окружности:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">&lt;</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">&lt;</span> B1<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">&lt;</span> B2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>B2 <span style="color: #000080;">&lt;</span> B1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
</ul>
<p>Все решение заключается в проверке этих трех условий.</p>
<p><span id="more-671"></span></p>
<h3>Задача B. Делители</h3>
<p>Пусть число Z имеет делитель X. Это значит, что существует такое целое положительное Y, что Z = X * Y. Однако, отсюда следует, что и Y является делителем Z. То есть для любого делителя X &lt; sqrt(Z) найдется также делитель Y &gt; sqrt(Z) и наоборот. Получаем, что наличие у числа Z делителя не равного sqrt(Z) не влияет на четность количества делителей. Осталось два случая:</p>
<ul>
<li>sqrt(Z) &#8211; целое число (соответственно, являющееся делителем Z), тогда ко всем парным делителям добавляется один непарный, и количество делителей получается нечетным;</li>
<li>sqrt(Z) &#8211; нецелое число, тогда количество делителей не изменяется и остается четным.</li>
</ul>
<p>Таким образом, задача сводится к определению, является ли Z квадратом целого числа. Ну а проверить это можно, десятком различных способов: от взятия вещественного корня до бинарного поиска.</p>
<h3>Задача C. Выгода</h3>
<p>Интуиция просто умоляет отсортировать оба массива по убыванию и вывести сумму A[i] * B[i] для всех i от 1 до min(N, M) в качестве ответа.И, как ни странно, это решение будет правильным.</p>
<p>Понятно, почему нужно брать наибольшие min(N, M) чисел из каждого массива. Докажем, почему произведения нужно брать именно в таком порядке.</p>
<p>Оставим в каждом массиве по K = min(N, M) наибольших чисел. Затем отсортируем массив A по убыванию. Теперь нужно расставить числа в массиве B так, чтобы сумма A[i] * B[i] была оптимальным ответом.</p>
<p>Общий метод решения в таких случаях следующий: возьмем два соседних элемента, посчитаем искомую функцию в обоих возможных порядках и посмотрим, какое условие должно выполняться для оптимального ответа.</p>
<p>В нашем конкретном случае:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>
&nbsp;
B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span></pre></div></div>

<p>помня, что A[i] &gt; A[i + 1], разделим обе части на A[i] &#8211; A[i + 1]:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span></pre></div></div>

<p>Таким образом, получили, что массив B также должен быть отсортирован по убыванию.</p>
<h3>Задача D. Лень</h3>
<p>Пусть ученик выучит X вопросов. Тогда в худшем случае N &#8211; A из них ему не попадутся на экзамене. Ну а остальных должно быть не меньше B чтобы получить пятерку. В общем, получается нужно выучить N &#8211; A + B вопросов.</p>
<h3>Задача E. Спираль</h3>
<p>Стандартная и довольно известная задача на реализацию. Нужно просто сделать то, что просят в задаче.</p>
<h3>Задача F. Степень</h3>
<p>Самая интересная задача и контеста. Во-первых, понятно, что нужно использовать быстрое возведение в степень. Но возникает проблема &#8211; при возведении в степень нужно считать промежуточные произведения довольно больших чисел, которое не вмещается в int64. В качестве обходного пути можно предложить посчитать произведение двух чисел, используя алгоритм быстрого возведения в степень. Более точно смотрите статью о <a title="A * B % C" href="http://arti.kz/18-a-b-c/">вычислении A * B % C</a>.</p>
<hr style="width: 20%;" />Дом Игрушки &laquo;Макси Тойз&raquo; предлагает <a href="http://www.maxitoys.ru/">детские игрушки оптом</a>. Товары отвечает самым строгим требованиям качества и безопасности!</p>
<p>Собрались делать ремонт? Заменить старые окна поможет <a href="http://www.oknamaster.ru/">www.oknamaster.ru &#8211; компания</a> предлагает производство и монтаж пластиковых окон в Москве.</p>
<p>А вы знали, что бывает <a href="http://www.urcomcity.ru">лицензия на вывоз мусора</a>? Разобраться с этим и другими видами лицензий поможет Юркомсити.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Screencast: TopCoder SRM 430</title>
		<link>http://arti.kz/603-screencast-topcoder-srm-430</link>
		<comments>http://arti.kz/603-screencast-topcoder-srm-430#comments</comments>
		<pubDate>Wed, 07 Jan 2009 06:54:46 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>
		<category><![CDATA[Скринкасты]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=603</guid>
		<description><![CDATA[Очередной screencast &#8211; TopCoder Single Round Match 430. Не очень удачный, но демонстрирует терпение и настойчивость Залито на RuTube по причине временного запрета загрузки на Kiwi. Музыка для фона отсюда: http://www.penmachine.com/podcast/. Ну а после просмотра скринкаста, можно почитать про мировой экономический кризис: статьи, факты, мнения, выводы.]]></description>
			<content:encoded><![CDATA[<p>Очередной screencast &#8211; TopCoder Single Round Match 430. Не очень удачный, но демонстрирует терпение и настойчивость <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Залито на RuTube по причине временного запрета загрузки на Kiwi.</p>
<p style="text-align: center;">
<object width="470" height="353"><param name="movie" value="http://video.rutube.ru/9f7e94ae227323fc2df17c301ee72e55"></param><param name="wmode" value="window"></param><param name="allowFullScreen" value="true"></param><embed src="http://video.rutube.ru/9f7e94ae227323fc2df17c301ee72e55" type="application/x-shockwave-flash" wmode="window" width="470" height="353" allowFullScreen="true" ></embed></object>
</p>
<p>Музыка для фона отсюда: <a title="Penmachine Podcast" href="http://www.penmachine.com/podcast/">http://www.penmachine.com/podcast/</a>.</p>
<p><span id="more-603"></span></p>
<hr style="width: 25%;" />Ну а после просмотра скринкаста, можно почитать про <a href="http://crisis-huisis.ru/">мировой экономический кризис</a>: статьи, факты, мнения, выводы.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/603-screencast-topcoder-srm-430/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Screencast: TopCoder SRM 425</title>
		<link>http://arti.kz/449-screencast-topcoder-srm-425</link>
		<comments>http://arti.kz/449-screencast-topcoder-srm-425#comments</comments>
		<pubDate>Sat, 06 Dec 2008 18:13:27 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>
		<category><![CDATA[Скринкасты]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=449</guid>
		<description><![CDATA[Некоторое время назад меня попросили записать то, как я пишу SRM. Оказалось, что они забрели на блог Пети Митричева и посмотрели на его скринкасты. Но видимо его гениальные коды слишком гениальны для начинающих, и вот мне пришлось тоже заняться этим. Эта идея мне показалась интересной &#8211; предлагаю Вам тоже попробовать записать скринкаст и выложить его. [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад меня попросили записать то, как я пишу SRM. Оказалось, что они забрели на блог <strong>Пети Митричева</strong> и посмотрели на его <a href="http://petr-mitrichev.blogspot.com/2008/10/screencast-and-challenging.html">скринкасты</a>. Но видимо его гениальные коды слишком гениальны для начинающих, и вот мне пришлось тоже заняться этим. Эта идея мне показалась интересной &#8211; предлагаю Вам тоже попробовать записать скринкаст и выложить его. Так можно хорошо посмеяться над самим собой и дать возможность другим поднабраться чуть-чуть опыта.</p>
<p>Встречаем <strong>425-й SRM</strong> (смотреть лучше, развернув на весь экран):</p>
<p style="text-align: center;">
<object width="576" height="432"><param name="movie" value="http://v.kiwi.kz/v/fvh8cksg0vfm/"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><param name="wmode" value="transparent"></param><embed src="http://v.kiwi.kz/v/fvh8cksg0vfm" type="application/x-shockwave-flash" width="576" height="432" allowFullScreen="true" allowScriptAccess="always"  wmode="transparent"></embed></object>
</p>
<p><a href="http://kiwi.kz/watch/download/fvh8cksg0vfm/?format=mp4">Скачать mp4 (512&#215;320)</a> ~140 Mb</p>
<p><strong>P.S.</strong> Кому интересно, выложил <a href="http://olympiads.kz/node/162">архив</a> республиканской олимпиады школьников 2008.<span id="more-449"></span></p>
<hr /><strong>Постовой</strong>:</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/449-screencast-topcoder-srm-425/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NEERC 2008</title>
		<link>http://arti.kz/416-neerc-2008</link>
		<comments>http://arti.kz/416-neerc-2008#comments</comments>
		<pubDate>Tue, 02 Dec 2008 17:46:56 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=416</guid>
		<description><![CDATA[Долго я не писал &#8211; сначала был занят подготовкой к сабжу, затем доделываением того, что не получилось сделать из-за подготовки и вот выдалась свободная минутка. NEERC 2008 &#8211; событие года для сотен студентов по всему СНГ. Именно к нему в течение года готовятся сильнейшие команды ВУЗов России, Беларусии, Грузии, Казахстана, Кыргызстана, Прибалтики, Армении, Азербайджана, Узбекистана [...]]]></description>
			<content:encoded><![CDATA[<p><em>Долго я не писал &#8211; сначала был занят подготовкой к сабжу, затем доделываением того, что не получилось сделать из-за подготовки и вот выдалась свободная минутка.</em></p>
<p><img class="alignleft size-full wp-image-428" title="NEERC" src="http://arti.kz/wp-content/uploads/2008/12/neerc.png" alt="" width="159" height="97" /><strong>NEERC 2008</strong> &#8211; событие года для сотен студентов по всему СНГ. Именно к нему в течение года готовятся сильнейшие команды ВУЗов <strong>России, Беларусии, Грузии, Казахстана, Кыргызстана, Прибалтики, Армении, Азербайджана, Узбекистана</strong> и, как выяснилось в этом году, <strong>Украины</strong>. Именно здесь рождаются легенды и умирают мечты. И именно здесь меня больше не будет в качестве участника.</p>
<p>Этот год по правилам соревнований последний, когда я могу участвовать в ACM ICPC, и я, соответсвенно старался использовать этот шанс по полной, собрал довольно сильную команду, но, увы, не получилось. Как всегда оказалась одна задача, решение которой было понятно, но по неизвестным причинам проходить все тесты оно не хотело. Итог &#8211; <strong>7 задач и 20 место</strong>.</p>
<p>Вообще, складывается такое ощущение, что насколько 2008 год удачен для России (ACM ICPC, футбол, хоккей, Евровидение), настолько же он неудачен для Казахстана и в частности для меня. Сначала совершенно глупое непрохождение отборочных раундов TCO, затем бредовый случай с визой для GCJ, теперь вот NEERC&#8230; Ну что, не будем отчаиваться, как говорится, не везет мне в картах, повезет в любви.</p>
<p>Далее &#8211; краткий обзор некоторых задач.</p>
<p><span id="more-416"></span></p>
<p>Во-первых следует сказать, что впервые на полуфинале был представлен новый вид задач &#8211; <strong>интерактивные задачи</strong>. По словам организаторов (да к тому же это очевидно), это открывает для жюри и участников совершенно новый обширный класс интересных проблем. В частности, смухлевать с решением онлайн задач в оффлайне уже не получится. Так как это был &laquo;пробный заезд&raquo;, задача B, которая была интерактивной, была сделана достаточно легкой, но, думаю, уже в следующем году сложность будет доведена до предела и командам придется туго.</p>
<p><strong>Задача A. Aerodynamics</strong></p>
<p>В задаче предлагается посчитать площади сечения выпуклой оболочки заданных точек плоскостями перпендикулярными оси OZ.</p>
<p>Во-первых понятно, что площади сечения будут выпуклыми многоугольниками (кроме вырожденных случаев). Во-вторых, вершинами этих многоугольников будут точки пересечения ребер нашей 3-мерной фигуры с плоскостями сечения. В-третьих, эти ребра представляют собой подмножество отрезков, построенных между каждой парой точек.</p>
<p>Используя эти факты и то, что ограничения довольно небольшие (всего 100 точек), можно предложить следующий алгоритм (считаем, что конкретная плоскость сечения у нас задана): построим всевозможные отрезки между точками и найдем точки их пересечения с нашей плоскостью. Затем построим выпуклую оболочку точек пересечения (уже 2-мерную (!)) и найдем ее площадь.</p>
<p><strong>Задача B. Blind Walk</strong></p>
<p>В задаче надо обойти все достижимые клетки лабиринта. При этом можно пытаться двигаться в разные стороны и программа жюри будет отвечать, можем ли мы туда пойти.</p>
<p>Решение просто &#8211; будем делать обычный обход в глубину, но вместо проверки возможности прохождения по карте будем спрашивать это у жюри.</p>
<p><strong>Задача D. Drive through MegaCity</strong></p>
<p>Эту задачу мы не решили, но судя по заверениям других участников один из возможных вариантов решения использует тот факт, что при оптимальном пути одна из координат изменяется монотонно.</p>
<p><strong>Задача E. Exclusive Access</strong></p>
<p>По слухам здесь надо было прочитать условие и, немного подумав, написать то, что просят.</p>
<p><strong>Задача F. Fibonacci System</strong></p>
<p>Выпишем в одну строку все натуральные числа от 1 до бесконечности в фиббоначиевой системе счисления. Нужно посчитать количество единиц среди первых N символов строки.</p>
<p>Во-первых, научимся считать количество единиц в строке из чисел от 1 до X, где X &#8211; число фиббоначи. Очевидно, что здесь можно вывести простую рекуррентную формулу, которую я приводить не буду ибо лень.</p>
<p>Во-вторых, найдем Y и Z &#8211; максимальное число фиббоначи и максимальное целое число, которое целиком поместилось в первые N символов строки.</p>
<p>Теперь, если мы сумеем посчитать количество единиц до Z, то задача решена (остаток строки можно просчитать переведя Z + 1 в фиббоначиеву систему счисления). Для этого посчитаем количество единиц до Y (это мы уже умеем), затем прибавим к ответу Z &#8211; Y + 1 и запустив рекурсивно функцию для Z &#8211; Y. Конец рекурсии &#8211; это 0 или 1.</p>
<p><strong>Задача G. Giant Screen</strong></p>
<p>Нужно просто сделать то, что просят в задаче.</p>
<p><strong>Задача H. Hell on the Markets</strong></p>
<p>Немного перефразированное условие задачи выглядит так: разделить массив чисел на два массива так, чтобы суммы чисел в обоих массивах были равны. При этом дается условие: a[i] &lt;= i (a &#8211; исходный массив чисел).</p>
<p>Насколько помню, задача решается жадно. Отсортируем числа по убыванию и будем добавлять их по порядку в тот массив, в котором текущая сумма меньше (если суммы одинаковы, то в любой). Если в конце получатся одинаковые суммы, то выводим ответ, если нет, то ответа не существует. Если кто знает доказательство правильности алгоритма, расскажите, пожалуйста, в комментариях.</p>
<p><strong>UPD.</strong> Доказательство правильности получено, спасибо <strong><a href="http://ttim.info">ttim</a></strong>. Идея основана на том, что в условии задачи сказано, что i-й элемент исходного массива не больше i.</p>
<p><strong>Задача I. iSharp</strong></p>
<p>Just do it!</p>
<p><strong>Задача J. Javanese Cryptoanalysis</strong></p>
<p>В задаче нужно поставить каждой букве текста в соответствие букву так, чтобы в итоге в каждом слове чередовались гласные и согласные буквы.</p>
<p>Составим граф. Вершинами будут буквы исходного текста. Между двумя вершинами будет ребро, если буквы соответствующие этим вершинам в каком-то слове стоят рядом. Тогда если граф не двудольный, решения не существует. В противном случае нам надо сделать так, чтобы в одной доле было не больше 5 букв (по количеству гласных), а в другой &#8211; не больше 21 (по количеству согласных). Сделать это можно, например, перебором.</p>
<p><strong>Задача K. KINA Is Not Abbreviation</strong></p>
<p>В задаче требуется заменить какое-нибудь словосочетание в тексте аббревиатурой с выполнением некоторых условий так, чтобы результирующий текст был минимально возможной длины.</p>
<p>На этой задаче многие команды и встали <img src='http://arti.kz/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Идея решения &#8211; заменим слова числами, преобразовав текст в последовательность чисел. Теперь переберем количество слов в последовательности и за один проход по строке посчитаем, сколько раз встречается каждое словосочетание. Для этого можно хешировать каждое словосочетание и использовать хеш таблицу для подсчета. Теперь осталось все аккуратно реализовать, что является здесь, как оказалось, главной проблемой.</p>
<hr /><strong>Постовой</strong>:</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/416-neerc-2008/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IX Всесибирская олимпиада</title>
		<link>http://arti.kz/408-ix-%d0%b2%d1%81%d0%b5%d1%81%d0%b8%d0%b1%d0%b8%d1%80%d1%81%d0%ba%d0%b0%d1%8f-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%b0</link>
		<comments>http://arti.kz/408-ix-%d0%b2%d1%81%d0%b5%d1%81%d0%b8%d0%b1%d0%b8%d1%80%d1%81%d0%ba%d0%b0%d1%8f-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%b0#comments</comments>
		<pubDate>Sat, 15 Nov 2008 17:27:50 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=408</guid>
		<description><![CDATA[В этом году я в первый (и, к сожалению, последний, по крайней мере, в роли участника) раз побывал на очном туре IX Открытой Всесибирской олимпиады по программированию имени И.В.Поттосина. В прошлом году по результатам интернет-тура моя команда тоже проходила, но из-за отсутствия финансирования и времени поехать не удалось. В этом году, благодаря КБТУ и, в [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-410" title="Бумеранг" src="http://arti.kz/wp-content/uploads/2008/11/300px-boomerang-298x300.jpg" alt="" width="298" height="300" />В этом году я в первый (и, к сожалению, последний, по крайней мере, в роли участника) раз побывал на очном туре <strong>IX Открытой Всесибирской олимпиады по программированию имени И.В.Поттосина</strong>. В прошлом году по результатам интернет-тура моя команда тоже проходила, но из-за отсутствия финансирования и времени поехать не удалось. В этом году, благодаря <strong>КБТУ</strong> и, в частности, <strong>Фуад-бею</strong> мы смогли поехать. Правда неполным составом, что сказалось на результатах.</p>
<p>Сначала <strong>немного об организации</strong>. По моим ощущениям, организаторам удалось одновременно сохранить &laquo;домашнюю&raquo; обстановку и провести все практически безупречно, что бывает редко. Приветливые организаторы, хорошая гостиница в двух минутах ходьбы от главного корпуса НГУ, где проходило все действие, нулевая задержка начала туров, правильно настроенные рабочие места, хорошие задачи, а также куча именитых спонсоров, быстрый бесплатный Wi-Fi ( <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) и два (!!) бесплатных обеда &#8211; все это говорит само за себя.</p>
<p><span id="more-408"></span></p>
<p>Теперь, собственно,<strong> о контесте</strong>. Вернее о двух. <strong>Первый ту</strong>р по правилам напоминал Marathone Match с TopCoder. Так как мы в этом опыта не имеем, то ограничились написанием и жесткой оптимизацией лобового решения. Что не помешало занять 17-е место. <strong>Второй тур</strong> проходил по правилам ACM. Его мы начали хорошо (да и закончили в общем-то неплохо <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) &#8211; в первый час даже некоторое время были на первом/втором местах. Единственный неприятный момент &#8211; затупили на задаче номер 9, которую сдали практически все &#8211; сказалось отсутствие третьего участника. Однако, нет худа без добра: после нескольких попыток сдать ее было решено бросить это безуспешное занятие и написать задачу 1, которую к тому времени <strong>не сдала ни одна команда</strong>. Ее решение было довольно очевидно &#8211; единственная проблема была в том, что писать надо было довольно долго и аккуратно. Но, как мы убедились в скором времени такой маневр вполне себя оправдал &#8211; мы ее сдали, в итоге оказавшись на <strong>12 месте</strong> с <strong>6 задачами</strong>, в отличие от команды <strong>SPb SU KOLOBOK</strong>, которые, столкнувшись с такой же проблемой, стали добивать 9 и в итоге остались с <strong>5 задачами</strong>. По итогам двух туров мы заняли 11 место, что в общем неплохо для неполного состава.</p>
<p>Ну и самое приятное &#8211; <strong>призы</strong>. Так как спонсоров было много, и все они были довольно крупные, хоть что-то получили все. За 11 место призы были довольно хорошие. Теперь у меня есть:</p>
<ul>
<li><strong>бумеранг</strong> от Microsoft (o_O);</li>
<li><strong>визитница</strong> от Microsoft;</li>
<li>еще одна <strong>футболка</strong> ImagineCup;</li>
<li><strong>наушники</strong> Defender HN102;</li>
<li>4Гб <strong>флешка</strong> Kingston;</li>
<li><strong>Open Solaris 2008.5 Live CD</strong>;</li>
<li><strong>странная книжка издания НГУ</strong> о библиотеке SmogDX <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</li>
</ul>
<hr /><strong>Постовой</strong>:</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/408-ix-%d0%b2%d1%81%d0%b5%d1%81%d0%b8%d0%b1%d0%b8%d1%80%d1%81%d0%ba%d0%b0%d1%8f-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%b0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KBTU Open, Fall 2008</title>
		<link>http://arti.kz/382-kbtu-open-fall-2008</link>
		<comments>http://arti.kz/382-kbtu-open-fall-2008#comments</comments>
		<pubDate>Tue, 21 Oct 2008 18:10:34 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=382</guid>
		<description><![CDATA[19 октября в КБТУ прошел неофициальный чемпионат Алматы &#8211; KBTU Open, Fall 2008. На удивление он оказался довольно популярным &#8211; участие приняли около 50 команд ВУЗов и школ Алматы и Талдыкоргана. Неожиданной сенсацией стало то, что второе место занял ученик 11-го класса 165-го лицея Алматы Амир Тулегенов, писавший контест в одиночку, с чем его и [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="KBTU" src="http://arti.kz/wp-content/uploads/2008/08/kbtu.png" alt="" width="150" height="66" />19 октября в КБТУ прошел неофициальный чемпионат Алматы &#8211; <strong>KBTU Open, Fall 2008</strong>. На удивление он оказался довольно популярным &#8211; участие приняли около <strong>50 команд</strong> ВУЗов и школ Алматы и Талдыкоргана. Неожиданной сенсацией стало то, что второе место занял ученик 11-го класса 165-го лицея Алматы <strong>Амир Тулегенов</strong>, писавший контест в одиночку, с чем его и поздравляю.</p>
<p>Кому интересно, выложены <a href="http://olympiads.kz/files/kbtu-open-2008-fall-ranklist.html">полные результаты</a>, <a href="http://olympiads.kz/files/kbtu-open-2008-fall-problems.pdf">задачи</a> и <a href="http://olympiads.kz/files/kbtu-open-2008-fall-tests.tar.bz2">тесты</a> олимпиады. Задачи были частично собраны из разных источников, частично составлены организаторами. Ниже представлен краткий разбор.</p>
<p><span id="more-382"></span></p>
<p><strong>Задачи A, I, J</strong></p>
<p>Решаются одинаково &#8211; just do it <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Задача B. B-Matrix</strong></p>
<p>К сожалению, эта задача не была решена никем. У нас было решение за O(n ^ 4), но написать его мы так и не решились &#8211; слишком уж долгим оно нам показалось. Если кто знает как решить меньше чем за 4-ю степень &#8211; буду рад, если поделитесь.</p>
<p><strong>Задача C. Calendar</strong></p>
<p>Стандартная игровая задача. Пусть каждая возможная дата &#8211; вершина графа. Если мы можем перейти от одной даты к другой, то делаем ориентированную дугу между соответствующими вершинами. Далее, вершину, соответствующую 2001-10-04 обозначаем проигрышной (так как, если игрок начинает ходить с этой даты, то другой игрок перед этим пришел в нее и, следовательно, выиграл). Теперь переберем все даты от 2001-10-03 до 1900-01-01 и обозначим соответствующую вершину выигрышной, если из нее есть ход хотя бы в одну проигрышную, и проигрышной, если такого хода нет. Далее просто выводим значение в соответствующей вершине.</p>
<p><strong>Задача D. Different Digits</strong></p>
<p>Как было доказано <strong>Дамиром Елеусизовым</strong>, оптимальный ответ всегда содержит не более двух различных цифр, которые можно перебрать и что-то затем с ними сделать. Однако, этот факт необязательно знать для решения задачи. Далее приведено решение, придуманное <strong>Бахытжаном Байжикеновым</strong>.</p>
<p>Составим граф, вершины которого соответствуют парам (x, y), где x &#8211; все целые числа от 0 до n &#8211; 1, а y &#8211; все подмножества цифр от 0-9, включающие не более 4 цифр (так как ответ с не более 5 цифрами нам уже известен &#8211; это само n). Из каждой вершины будет исходит 10 направленных ребер: (x, y) -&gt; ((x * 10 + i) % n, y + {i}), где 0 &lt;= i &lt;= 9. Путь в этом графе от какой-то из вершин (i % n, {i}) (1 &lt;= i &lt;= 9) до (0, z) и будет являться искомым числом. Теперь просто надо выбрать минимальное из этих чисел.</p>
<p>Чтобы уменьшить количество используемой памяти с n * C(n, 4) до O(n), можно задавать подмножество разрешенных цифр и ходить в графе только по ребрам, соответствующим этим цифрам. При этом перебирать подмножества лучше всего в порядке увеличения количества задействованных цифр.</p>
<p><strong>Задача E. Easy work</strong></p>
<p>Тоже задача из серии &laquo;just do it&raquo;, но здесь (по крайней мере по условию) может быть такой прикол, что офис изначально не пустой, и кто-то выйдет не заходя, поэтому для сбережения нервов лучше это учесть.</p>
<p><strong>Задача F. Find the Sum</strong></p>
<p>Научимся считать сумму от 0 до X, а затем воспользуемся тем фактом, что f(l, r) = f(r) &#8211; f(l &#8211; 1).</p>
<p>Пусть X состоит из n разрядов (s[0] &#8230; s[n - 1]). Пройдем по ним со старшего до младшего. Пусть:</p>
<ul>
<li>i &#8211; номер текущего разряда (нумеруем с младшего);</li>
<li>t(i) = s[n - 1] + s[n - 2] + &#8230; + s[i + 1].</li>
</ul>
<p>Тогда f(X) = sum(sum((t(i) + j) * 10 ^ i + g(i), j = 0..s[i] &#8211; 1), i = n &#8211; 1..0), где g(i) = f(10 ^ i &#8211; 1) = g(i &#8211; 1) * 10 + 45 * 10 ^ (i &#8211; 1). Вроде так, но если и не совсем так, то очень похоже <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Задача G. Game</strong></p>
<p>Все довольно просто: пусть r &lt;= g (если это не так, поменяем r и g местами). Тогда состояние (r, g) проигрышное, если r = g = 0 или (g &#8211; r) делится на максимальную степень двойки, на которую делится r, и выигрышное в противном случае или когда r = 0. Другой вопрос, как к этому прийти <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  В условиях контеста проще всего написать несложную квадратичную динамику и посмотреть на значения функции при 1 &lt;= r, g &lt;= 100 &#8211; закономерность видна сразу.</p>
<p><strong>Задача H. Hallway</strong></p>
<p>Будем перебирать радиус шара двоичным поиском.</p>
<p>Пусть радиус шара &#8211; R. Как определить, можно ли его протащить по этому корридору? Уменьшим окружность, соответствующую шару до точки, одновременно превратив заданные точки в окружности радиуса R и сдвинув верхнюю и нижнюю стороны корридора друг к другу, каждую на R. Можно доказать, что задача протаскивания точки здесь эквивалентна протаскиванию шара в исходной задаче.</p>
<p>Теперь построим граф (да, опять <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Вершинами будут верхняя и нижняя стороны корридора и каждый столб. Соединим вершины ребрами, если в новом рисунке они строго пересекаются (не касаются). Тогда, если существует путь в этом графе от одной стороны корридора до другой, то точку протащить нельзя.</p>
<p><strong>Задача K. KBTU party</strong></p>
<p>Решать задачу можно двумя способами:</p>
<ul>
<li>найти хорошего математика;</li>
<li>подобрать формулу.</li>
</ul>
<p>За отсутствием математика нам пришлось подбирать формулу, которая оказалась не такой уж и сложной. Достаточно было сгенерить значения для n, r &lt;= 10 по очевидной формуле динамики: d[n, r] = d[n - 1, r] + (2 * n &#8211; r) * d[n - 1, r - 1]. Для n = r получим d[n, r] = n!. Для r = 1, d[n, r] = n ^ 2. Для n &gt; r: d[n, r] = d[n - 1, r] * (n ^ 2) / ((n &#8211; r) ^ 2), или что-то вроде <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Далее надо лишь аккуратно запрограммировать последовательное вычисление d[n, r], вспомнив, как вычислять обратное число по модулю. К счастью, &laquo;совершенно случайно&raquo; число 2946859 оказалось простым <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr /><strong>Постовой</strong>:</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/382-kbtu-open-fall-2008/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>arti&#039;s TopCoder Tools</title>
		<link>http://arti.kz/371-artis-topcoder-tools</link>
		<comments>http://arti.kz/371-artis-topcoder-tools#comments</comments>
		<pubDate>Tue, 14 Oct 2008 18:04:48 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=371</guid>
		<description><![CDATA[С самого первого контеста на TopCoder мне показалось очень неудобным полностью писать вручную класс решения. Я попробовал пару плагинов, которые можно найти на сайте, но они мне не понравились. Минусом многих плагинов (для меня) является интеграция в какую-то IDE или арену &#8211; я обычно использую только какой-нибудь редактор кода и файловый менеджер (обычно Kate + [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-370" title="TopCoder" src="http://arti.kz/wp-content/uploads/2008/10/topcoder_logo.gif" alt="" width="210" height="40" />С самого первого контеста на <strong>TopCoder</strong> мне показалось очень неудобным полностью писать вручную класс решения. Я попробовал пару плагинов, которые можно найти на сайте, но они мне не понравились. Минусом многих плагинов (для меня) является интеграция в какую-то IDE или арену &#8211; я обычно использую только какой-нибудь редактор кода и файловый менеджер (обычно <strong>Kate + Midnight Commander</strong>, а в плохие дни <strong>Far Manager + Notepad++</strong>). Также, для тестирования решения на разных тестах с помощью обычных плагинов нужно перекомпилировать решение, что, согласитесь, в корне неправильно.</p>
<p>В итоге я написал свою небольшую <strong>систему скриптов</strong>, которой и делюсь с Вами. Возможности:</p>
<ul>
<li>генерация класса решения на основе прототипа;</li>
<li>удаление unused code;</li>
<li>каждый тест &#8211; отдельный файл;</li>
<li>автоматическая генерация тестов из условия;</li>
<li>проверка на отдельном тесте или всех тестах по очереди с проверкой правильности ответа и времени выполнения и красивой подсветкой результатов тестирования;</li>
<li>копирование ваших библиотек (prewritten code) для удобства непосредственно в каталог задачи;</li>
<li>скрипты написаны с использованием <strong>C++</strong> и <strong>Bash</strong> (для Windows &#8211; <strong>bat</strong>) кроме одного на <strong>Java</strong>, так что все работает очень быстро.</li>
</ul>
<p><span id="more-371"></span></p>
<p>Для работы необходимо:</p>
<ul>
<li>распаковать архив (например в <strong>topcoder/utils</strong>);</li>
<li>для инициализации контеста запустить скрипт <strong>./tsc</strong> из <strong>topcoder/utils</strong>, передав в качестве параметра название контеста или любую строку, это будет название подкаталога в каталоге topcoder (например, <strong>./tsc srm411-division1</strong>);</li>
<li>скопировать условие задачи в соответствующий файл в подкаталоге statements в только что созданном каталоге с названием контеста (например, <strong>topcoder/srm411-division1/statements/a.txt</strong>);</li>
<li>перейти в каталог соответствующий задаче (<strong>topcoder/srm411-division1/a</strong>);</li>
<li>запустить скрипт <strong>tgp</strong> &#8211; он создаст файл для класса-решения (<strong>.h</strong>), программу для тестирования (<strong>.cpp</strong>) и скопирует <strong>.h</strong>-файлы из <strong>topcoder/utils/includes</strong> в текущую папку;</li>
<li>запустить <strong>tgt</strong> &#8211; сгенерятся тесты из условия;</li>
<li>решить задачу <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; редактировать надо только файл <strong>.h</strong>;</li>
<li>скомпилировать командой <strong>tgcc</strong>;</li>
<li>проверить на тестах &#8211; <strong>tgta</strong>;</li>
<li>почистить unused code &#8211; <strong>tcl ClassName.h</strong>;</li>
<li>отправить текст из <strong>ClassName.h</strong> в арену (может помочь скрипт <strong>tcp ClassName.h</strong>, к сожалению для X-ов программно скопировать текст из консоли не получилось <img src='http://arti.kz/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ).</li>
</ul>
<p>Выглядит сложно, но если потренироваться пару раз, то все работает очень быстро и лишнее время тратится только на копирование условия / текста решения.</p>
<p>Система используется больше двух лет (правда в основом Linux-версия) и ни разу не подводила (по крайней мере, я не помню случаев). На данный момент все фичи работают для <strong>C++</strong> и есть очень базовая поддержка <strong>Java</strong> (генерация прототипа &#8211; <strong>tgp</strong> с параметром <strong>java</strong>, компиляция &#8211; <strong>tjc</strong>).</p>
<p>Выкладываю как Linux, так и Windows-версию:</p>
<p><a href="http://arti.kz/wp-content/uploads/2008/10/tctools-linux.tar.bz2">arti&#8217;s TopCoder Tools (Linux)</a></p>
<p><a href="http://arti.kz/wp-content/uploads/2008/10/tctools-win32.tar.bz2">arti&#8217;s TopCoder Tools (Windows)</a></p>
<p>Использовать на свой страх и риск, очень рекомендую попробовать в practice session перед использованием непосредственно на контесте. Вопросы, предложения и дополнения принимаются в комментариях и на email.</p>
<hr /><strong>Постовой</strong> (да, да, и я тоже <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ):</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/371-artis-topcoder-tools/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Книги по олимпиадному программированию</title>
		<link>http://arti.kz/325-%d0%ba%d0%bd%d0%b8%d0%b3%d0%b8-%d0%bf%d0%be-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%bd%d0%be%d0%bc%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0</link>
		<comments>http://arti.kz/325-%d0%ba%d0%bd%d0%b8%d0%b3%d0%b8-%d0%bf%d0%be-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%bd%d0%be%d0%bc%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0#comments</comments>
		<pubDate>Tue, 23 Sep 2008 16:49:37 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=325</guid>
		<description><![CDATA[На днях со мной связался экс-тренер казахстанской сборной IOI Алдияр Даулеткулов и предложил выложить свои книги на http://olympiads.kz, что я, собственно, и сделал: Олимпиады по информатике, Основы программирования на языке Паскаль. От себя добавлю, что &#171;Олимпиады по информатике&#187; &#8211; первая книга по олимпиадному программированию, которую я прочитал. В ней достаточно понятно разобраны многие задачи, и, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-326" title="Книги" src="http://arti.kz/wp-content/uploads/2008/09/books.jpg" alt="" width="200" height="160" />На днях со мной связался экс-тренер казахстанской сборной IOI <strong>Алдияр Даулеткулов</strong> и предложил выложить свои книги на <a href="http://olympiads.kz">http://olympiads.kz</a>, что я, собственно, и сделал: <a href="http://olympiads.kz/node/136">Олимпиады по информатике</a>, <a href="http://olympiads.kz/node/137">Основы программирования на языке Паскаль</a>.</p>
<p>От себя добавлю, что &laquo;<strong>Олимпиады по информатике</strong>&raquo; &#8211; первая книга по олимпиадному программированию, которую я прочитал. В ней достаточно понятно разобраны многие задачи, и, хотя в настоящее время они являются достаточно простыми, книга с успехом может использоваться теми, кто только начинает этот долгий и тернистый путь. Про вторую книгу ничего сказать не могу, так как с Паскалем у нас довольно натянутые отношения <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>P.S.</strong> Вчера решал одну задачку и написал такую вот функцию:</p>
<pre>bool sign(int x) {
  if (x) return x / abs(x);
  return 0;
}</pre>
<p>Долго не мог понять, почему у меня не работала программа. Проблема оказалась в том, что даже в этом простом коде есть два бага (хотя мне был важен только один) &#8211; попробуйте их найти <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/325-%d0%ba%d0%bd%d0%b8%d0%b3%d0%b8-%d0%bf%d0%be-%d0%be%d0%bb%d0%b8%d0%bc%d0%bf%d0%b8%d0%b0%d0%b4%d0%bd%d0%be%d0%bc%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ACM ICPC: тяжело в учении &#8211; легко в бою</title>
		<link>http://arti.kz/256-acm-icpc-%d1%82%d1%8f%d0%b6%d0%b5%d0%bb%d0%be-%d0%b2-%d1%83%d1%87%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bb%d0%b5%d0%b3%d0%ba%d0%be-%d0%b2-%d0%b1%d0%be%d1%8e</link>
		<comments>http://arti.kz/256-acm-icpc-%d1%82%d1%8f%d0%b6%d0%b5%d0%bb%d0%be-%d0%b2-%d1%83%d1%87%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bb%d0%b5%d0%b3%d0%ba%d0%be-%d0%b2-%d0%b1%d0%be%d1%8e#comments</comments>
		<pubDate>Fri, 19 Sep 2008 13:30:30 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=256</guid>
		<description><![CDATA[Предупреждение. Данная статья отражает исключительно мнение автора. Автор не претендует на верность всех утверждений. Статья предоставляется &#171;как есть&#187;, и автор не несет ответственности за какие бы то ни было отрицательные последствия ее прочтения и использования Многие студенты, начав участвовать в олимпиадах, задаются вопросом: &#171;Как добиться каких-либо значительных результатов?&#171;. Здесь есть два варианта: вы &#8211; гений, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Предупреждение.</strong> <em>Данная статья отражает исключительно мнение автора. Автор не претендует на верность всех утверждений. Статья предоставляется &laquo;как есть&raquo;, и автор не несет ответственности за какие бы то ни было отрицательные последствия ее прочтения и использования <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p><img class="alignleft size-full wp-image-318" style="margin-right: 20px" title="Штангист" src="http://arti.kz/wp-content/uploads/2008/09/sport.jpg" alt="" width="200" height="156" />Многие студенты, начав участвовать в олимпиадах, задаются вопросом: &laquo;<strong>Как добиться каких-либо значительных результатов?</strong>&laquo;. Здесь есть два варианта:</p>
<ol>
<li>вы &#8211; <a href="http://sharpc.livejournal.com/21303.html">гений</a>, в этом случае, скорее всего, вам не надо читать дальше <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>вы &#8211; обычный студент, тогда единственный ответ &#8211; тренироваться, об этом и пойдет речь.</li>
</ol>
<p>В последнее время меня несколько раз спрашивали &laquo;<strong>как надо готовиться к ACM ICPC</strong>&laquo;? В свое время и я задавал его некоторым личностям, но так и не получил вразумительного ответа. Поиск в Интернет также практически ничего не дал &#8211; видимо, известные корифеи спортивного программирования не очень любят писать. В общем пришлось, как всегда, доходить практически до всего самому, и здесь мне пригодился 7-летний опыт занятий некоторым, <a href="http://ru.wikipedia.org/wiki/Бальные_танцы">довольно специфическим видом спорта</a>. Так или иначе, не без помощи руководителя и товарищей, я получил некоторый опыт, которым и постараюсь поделиться с вами &#8211; может кому-нибудь и пригодится.</p>
<p><span id="more-256"></span></p>
<p>Прежде всего необходимо уяснить, что <strong>олимпиады по программированию, особенно ACM ICPC, &#8211; это спорт</strong>. И подготовка к ним должна быть как к спортивным состязанием. Это включает постоянные упорные тренировки, удачи и неудачи, взлеты и падения.</p>
<p>Тренироваться нужно как можно чаще. Не реже 1-2 раз в неделю (а непосредственно перед соревнованиями желательно каждый день) делать командную тренировку, а в течение недели готовиться поодиночке.</p>
<p>Есть 3 направления подготовки, которые должны идти параллельно и взаимно дополнять друг друга:</p>
<ol>
<li>теоретическая (математика, алгоритмы и структуры данных);</li>
<li>практическая (стандарты, языки и ООП, решение задач);</li>
<li>командная.</li>
</ol>
<p><strong>Теоретическая подготовка: математика</strong></p>
<p>Часто можно услышать в качестве причины нежелания участвовать в олимпиадах такое утверждение: &laquo;Да там же сплошная математика!&raquo; Это одновременно и правда, и не совсем. В самом деле, чтобы успешно выступать на соревнованиях необходимо знать почти весь школьный курс математики, некоторые сведения из теории графов, теории чисел и т.п. Но в реальности все не так страшно. Школьный курс математики должны знать все, кто учился в школе, а из нешкольных разделов в большинстве случаев достаточно понимания определений и некоторого знакомства с базовыми теоремами и приемами. Этого будет хватать для большинства обычных соревнований, но может быть недостаточным для контестов от МГУ на Петрозаводских сборах <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Отдельно следует выделить геометрию &#8211; если вы хотите хорошо решать геометрические задачи, то надо, как минимум, свободно владеть аппаратом аналитической геометрии, т.е. понимать уравнения линий, уметь находить их точки пересечения и т.п. Причем следует иметь в виду, что во многих случаях пространственная задача легко разбивается в несколько задач на плоскости значительно менее сложных, чем исходная. Также пригодится понимание основ начертательной геометрии.</p>
<p>Несколько направлений помимо школьного курса, с которыми следует ознакомиться:</p>
<ol>
<li>основы теории чисел: остатки, теорема Эйлера, теоремы Ферма, Китайская теорема об остатках;</li>
<li>матрицы: операции с матрицами, определитель, ранг, метод Гаусса;</li>
<li>геометрия: геометрические преобразования, основы начертательной геометрии;</li>
<li>комбинаторика: сочетания, перестановки, метод включения-исключения;</li>
<li>теория вероятностей: понятие вероятности, базовые формулы.</li>
</ol>
<p><strong>Теоретическая подготовка: алгоритмы и структуры данных</strong></p>
<p>Другая сторона теоретической подготовки &#8211; изучение существующих алгоритмов и структур данных. Конечно, здесь нужно изучать все гораздо подробнее и больше, чем в чистой математике, однако все равно нужно знать меру: редкие и/или сверхсложные алгоритмы практически никогда не пригодятся на олимпиадах &#8211; либо не будет задач на эту тему, либо время на их написание будет неоправданно длительным. Однако это не побуждение к их неизучению &#8211; чем больше алгоритмов вы знаете, тем лучше &#8211; кто знает, может когда-нибудь и пригодится. Будет очень полезно, как минимум, иметь о них представление.</p>
<p>Вот небольшой, далеко не полный список для начала:</p>
<ol>
<li>динамическое программирование;</li>
<li>алгоритмы на графах (обходы, кратчайшие пути, стягивающие деревья, потоки, паросочетания, мосты, точки сочленения);</li>
<li>геометрические алгоритмы (заметающая прямая, построение выпуклой оболочки, определение принадлежности точки многоугольнику и т.п.);</li>
<li>алгоритмы на строках (поиск подстроки, префикс-функция, z-функция);</li>
<li>простые математические алгоритмы (алгоритм Евклида, быстрое возведение в степень, нахождение простых чисел, разложение на множители);</li>
<li>структуры данных (стек, очередь, двоичное дерево, сбалансированное двоичное дерево, дерево интервалов, дерево Фенвика, бор, суффиксное дерево, хэш-таблица).</li>
</ol>
<p><strong>Практическая подготовка: стандарты</strong></p>
<p>Эта часть подготовки включает в себя тренировку навыков кодирования стандартных алгоритмов, про которые говорилось в предыдущих разделах. Эти алгоритмы во время соревнования не должны писаться в первый раз, так как сколь способным программистом вы бы ни были, в первый раз легко допустить ошибку, не учесть какой-то крайний случай, да и вообще, это долго. Они должны &laquo;отскакивать от пальцев&raquo;. Для этого необходимо все их проработать на тренировках, добиться того, чтобы код одного и того же алгоритма, написанный в разное время для разных задач, совпадал с точностью до имен переменных. Могу предложить такую схему заучивания алгоритма:</p>
<ol>
<li>изучить сам алгоритм, разобрать до мельчайших деталей;</li>
<li>написать реализующий его код, строго следя за соответствием кода и алгоритма;</li>
<li>удостовериться в правильности написанного кода, составив несколько тестов и написав менее эффективный, но более простой алгоритм;</li>
<li>составить 20 или более тестов, как ручных так и случайных и сгенерить к ним ответы, используя уже написанные программы;</li>
<li>раз в день в течение 1-2 недель вечером писать код алгоритма, стараясь каждый раз сохранять последовательность инструкций, циклов, названия переменных и т.п., и проверять его на составленных заранее тестах, причем подсматривать куда-то можно лишь первые 2-3 раза.</li>
</ol>
<p>В результате таких тренировок у вас к элементарным кирпичикам кода вроде сортировки из STL добавится довольно внушительное количество несколько более сложных блоков, на кодирование которых будет уходить очень небольшое количество времени и ресурсов головного мозга.</p>
<p><strong>Практическая подготовка: языки и ООП</strong></p>
<p>Одна из важнейших частей, про которую забывают многие олимпиадники, особенно школьники. Конечно, для достаточно успешного участия достаточно знать основы языка: типы данных, переменные, циклы и функции. Однако современные задачи часто гораздо удобнее и быстрее закодировать, если знать некоторые более глубокие особенности языка и основы ООП. Чем лучше вы знаете язык программирования, на котором пишете контесты, тем меньше у вас будет досадных ошибок при кодировании и тем лучше будут как внешние (читабельность), так и внутренние (скорость) характеристики кода.</p>
<p>Также неплохо бы знать основы объектно-ориентированного программирования и особенности его реализации в используемом языке. ООП может помочь при написании, например, запутанной задачи на моделирование, сделать использование структур данных значительно более удобным, улучшить переиспользуемость кода.</p>
<p><strong>Практическая подготовка: решение задач</strong></p>
<p><strong>Решение задач &#8211; самое главное направление подготовки</strong>. Без него изучение теории и получение практических навыков становится бессмысленной тратой времени. Решать нужно много. Даже когда нет возможности собраться командой &#8211; надо решать поодиночке. Сейчас существует довольно много онлайн-архивов с тысячами задач. Возможность прорешать все есть далеко не у многих, поэтому нужно стараться решать больше сложных и нестандартных задач &#8211; ведь именно такие задачи на реальном контесте, когда все остальные уже решены, определяют победителя. Однако про стандартные и простые задачи тоже не следует забывать &#8211; на контесте они должны решаться в первую очередь и очень быстро, так как именно скорость их сдачи может определить большую часть штрафного времени, что в конечном счете при спорных ситуациях пойдет вам на пользу. Поэтому некоторую часть времени нужно потратить и на них. Конечно здесь не имеются в виду задачи типа &laquo;A + B&raquo;.</p>
<p>Старайтесь также участвовать во всех онлайн-контестах, которых сможете. Это поможет прочувствовать дух соревнований, справиться с волнением, которое возникает у многих на реальном соревновании.</p>
<p>Решение большого количества задач на английском языке также улучшит ваше понимание английского текста. На контесте не должно тратиться время на перевод &#8211; текст задачи должен читаться с ходу любым членом команды.</p>
<p>Список архивов, которые мне нравятся больше всего (на них немного задач, но большая часть из них достаточно интересна):</p>
<ul>
<li><a href="http://acm.sgu.ru">Архив Саратовского ГУ</a>;</li>
<li><a href="http://acm.timus.ru">Архив Уральского ГУ</a>;</li>
<li><a href="http://acm.mipt.ru">Архив МФТИ</a>.</li>
</ul>
<p>Из онлайн-соревнований:</p>
<ul>
<li><a href="http://opencup.ru">Открытый кубок по программированию</a>;</li>
<li><a href="http://topcoder.com/tc">TopCoder</a>;</li>
<li><a href="http://neerc.ifmo.ru/trains">Тренировки SPb IFMO</a>;</li>
<li><a href="http://acmicpc-live-archive.uva.es/nuevoportal/">ACM ICPC Live Archive</a>;</li>
<li><a href="http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_content&amp;task=view&amp;id=2&amp;Itemid=10">UVa Online Judge contest system</a>.</li>
</ul>
<p>Если у вас долгое время не получается решить какую-то задачу &#8211; не идет и все тут, попробуйте оставить ее и вернуться через некоторое время. Если и так не пошло, то постарайтесь узнать у тех, кто ее решил, намек на решение &#8211; скорее всего это будет какой-то новый для вас прием, который можно будет взять на вооружение и с успехом применять в других задачах.</p>
<p><strong>Командная подготовка</strong></p>
<p>Командная работа &#8211; именно то, что отличает ACM ICPC от других олимпиад типа IOI, TopCoder и т.д. Она совершенствуется только когда вы всей командой пишете контест, виртуальный или реальный. О взаимодействии внутри команды уже написано в нескольких статьях, которые приведены в конце, так что распыляться на эту тему не буду. Поделюсь лишь парой приемов командного программирования, которые не раз реально помогали:</p>
<p>1. <strong>парное написание кода</strong> &#8211; что-то вроде <a href="http://en.wikipedia.org/wiki/Extreme_Programming">Extreme Programming</a>, когда один член команды пишет код, а другой в следит за написанием и сразу же корректирует, если видит ошибку. Таким образом можно практически исключить возможность опечаток типа j вместо i и т.п. Это же поможет, если человек, хорошо и быстро пишущий код не совсем понимает само решение &#8211; второй будет ему подсказывать и направлять;</p>
<p>2. <strong>кодер + тестер</strong> &#8211; тесты составляются не тем, кто пишет код, а напарником, причем во время написания кода;</p>
<p>3. <strong>конвейер</strong> &#8211; хорошо помогает в начале контеста, когда есть несколько простых нерешенных задач. Кодер сдает подряд несколько задач, которые ему подсовывают сокомандники, объясняя условие, решение и сделав несколько тестов.</p>
<p>Во время подготовки важно отработать все приемы и добиться того, чтобы не возникало споров, кто, что будет делать.</p>
<p><strong>Заключение</strong></p>
<p>В основной части не упомянута еще одна немаловажная сторона подготовки &#8211; психологическая. Нужно всегда быть готовым к неудачному выступлению, конечно, стараясь этого не допускать. Однако, если все-таки это произошло &#8211; не надо отчаиваться, все бросать и т.п. Следует хорошо проанализировать весь ход событий, найти свои ошибки и стараться в будущем их не совершать.</p>
<p>В конечном счете все зависит только от вас. Если вы хотите добиться хороших результатов, нужно быть готовым пожертвовать свободным временем. Но не следует пропускать занятия в университете в пользу тренировок, по крайней мере, не все <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Многие предметы, в частности математика, дискретная математика, физика, начертательная геометрия и, естественно, все предметы, связанные с программированием, могут сослужить хорошую службу при решении задач (а остальные &#8211; для хорошего сна <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>На этом все. Готовьтесь, и удачи вам на предстоящих четвертьфиналах!</p>
<p>Что еще почитать:</p>
<p><a href="http://acm.mipt.ru/twiki/bin/view/Algorithms/OlimpiadMinimum">Теоретический и практический минимум для участия в олимпиадах</a> (И. Квасов)</p>
<p><a href="http://inf.1september.ru/articlef.php?ID=200600106">О решении олимпиадных задач по программированию формата ACM ICPC</a> (С.А. Оршанский, чемпион мира ACM ICPC 2004 г.)</p>
<p><a href="http://www.fizmat.kz/uploaded/other/olmpicadvices_it.doc ">Подготовка к школьным олимпиадам по информатике</a> (Б. Маткаримов, тренер сборной Казахстана по IOI)</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/256-acm-icpc-%d1%82%d1%8f%d0%b6%d0%b5%d0%bb%d0%be-%d0%b2-%d1%83%d1%87%d0%b5%d0%bd%d0%b8%d0%b8-%d0%bb%d0%b5%d0%b3%d0%ba%d0%be-%d0%b2-%d0%b1%d0%be%d1%8e/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

