<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xml:lang="ja">
	<channel>
		<title>blue_jamのTopCoder日記</title>
		<link>http://topcoder.g.hatena.ne.jp/blue_jam/</link>
		<description>blue_jamのTopCoder日記</description>
		<dc:creator>blue_jam</dc:creator>


		<item>
			<title>SRM 690(Div.1 Easyのみ)</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20160504/1462332831</link>

			<description><![CDATA[
		<div class="section">
			<p>この記事ははてなブログ<a href="http://blue-jam.hatenablog.com/entry/2016/05/04/130116" target="_blank">http://blue-jam.hatenablog.com/entry/2016/05/04/130116</a>に移動しました．</p>
		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Wed, 04 May 2016 03:33:51 GMT</pubDate>



		</item>

		<item>
			<title>[SRM][Practice]SRM 481 Div1 Easy, Medium</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110916/1316154005</link>

			<description><![CDATA[
		<div class="section">
			<h4>Easy概要</h4>
			<p>卵が先に出てきたのか，鶏が先にでてきたのか気になったので，過去を見通す力がある人に聞こうとした．</p>
			<p>しかし，その人はすでにn人の人に同じことを聞かれていたので，もう答えたくないといった．</p>
			<p>そこで，そのn人を紹介してもらいそれぞれに卵が先か鶏が先かたずねた．eggCount人は卵が先だと答えたが，それ以外の人は鶏が先だと答えた．</p>
			<p>正解がわからず再び超能力者に会うと，どうやらlieCount人には嘘の情報を教えたらしい．また，liarCount人は超能力者に教えてもらった答えと反対のことを言っているという．（嘘をついている人が本当のことを教えてもらったとは限らない）</p>
			<p>果たして卵が先か，鶏が先なのだろうか．はたまた超能力者は嘘をついているのだろうか．</p>
			<h4>Easy解法</h4>
			<p>卵と答えた人のうち，嘘をついている人をiとし，ループ処理を行う．</p>
			<p>鶏と答えた人のうち，嘘をついている人をjとすると，j = liarCount - i</p>
			<p>これを元に，実際に卵と教えられた人，鶏と教えられた人の人数を計算する．</p>
			<p>lieCountとその人数が等しければ，そちらが嘘だと判断することができる．</p>
			<p>しかし，この方法に基づき卵，鶏の両方が嘘だと判断されたなら，正解はわからない．</p>
			<p>この方法に基づき，卵，鶏の両方とも嘘ではないと判断されたなら，超能力者はうそつき．</p>
			<p>1回といたことがあるにもかかわらず，129ptぐらいだった．遅すぎ．</p>
<pre class="syntax-highlight">
<span class="synType">class</span> ChickenOracle {
    <span class="synStatement">public</span>:
    string theTruth(<span class="synType">int</span> n, <span class="synType">int</span> eggCount, <span class="synType">int</span> lieCount, <span class="synType">int</span> liarCount) {
        <span class="synType">int</span> res = <span class="synConstant">0</span>;
        <span class="synType">int</span> chickenCount = n - eggCount;
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>; i&amp;#<span class="synConstant">60</span>;=liarCount; ++i){
            <span class="synType">int</span> j = liarCount - i;
            <span class="synType">int</span> e = eggCount - i + j;
            <span class="synType">int</span> c = chickenCount - j + i;
            <span class="synStatement">if</span>(i &amp;#<span class="synConstant">62</span>; eggCount || j &amp;#<span class="synConstant">62</span>; chickenCount) <span class="synStatement">continue</span>;
            <span class="synStatement">if</span>(e == lieCount){
                <span class="synStatement">if</span>(res == <span class="synConstant">2</span> || res == <span class="synConstant">3</span>){
                    res = <span class="synConstant">3</span>;
                }
                <span class="synStatement">else</span>{
                    res = <span class="synConstant">1</span>;
                }
            }
            <span class="synStatement">if</span>(c == lieCount){
                <span class="synStatement">if</span>(res == <span class="synConstant">1</span> || res == <span class="synConstant">3</span>){
                    res = <span class="synConstant">3</span>;
                }
                <span class="synStatement">else</span>{
                    res = <span class="synConstant">2</span>;
                }
            }
        }
        <span class="synStatement">if</span>(res == <span class="synConstant">0</span>){
            <span class="synStatement">return</span> <span class="synConstant">&quot;The oracle is a lie&quot;</span>;
        }
        <span class="synStatement">else</span> <span class="synStatement">if</span>(res == <span class="synConstant">1</span>){
            <span class="synStatement">return</span> <span class="synConstant">&quot;The chicken&quot;</span>;
        }
        <span class="synStatement">else</span> <span class="synStatement">if</span>(res == <span class="synConstant">2</span>){
            <span class="synStatement">return</span> <span class="synConstant">&quot;The egg&quot;</span>;
        }
        <span class="synStatement">else</span>{
            <span class="synStatement">return</span> <span class="synConstant">&quot;Ambiguous&quot;</span>;
        }
    }
};
</pre>

			<h4>Medium概要</h4>
			<p>1台のコンピュータと，n個の処理がある．</p>
			<p>コンピュータは1度に1つの処理しか行うことができない．</p>
			<p>処理にはuserが対応付けられていて，複数の処理を行うuserもいる．</p>
			<p>userの待ち時間(userの処理がすべて終了するまでの時間)の総和が最小になるように順番を決める．</p>
			<p>上記の条件を満たすように順番はランダムで定められる．</p>
			<p>各処理が終了する時間の期待値を求める．</p>
			<h4>Medium解法</h4>
			<p>こういう期待値を計算するのは苦手．</p>
			<p>userの待ち時間の合計を最小にするには，すべての処理にかかる時間がもっとも小さいuserからさきに処理を行わせればいい．これはわりとよく問題で出てくるからほぼ条件反射．</p>
			<p>同じ処理時間であれば，userの順番が前後することがある．</p>
			<p>同じuserであれば，処理の順番が前後することがある．</p>
			<p>同一userの処理の間に別のuserの処理が入ることはありえない．</p>
			<p>現在調べている処理のuserをA，現在調べている処理にかかる時間をt1，Aの処理の合計時間よりも短い処理時間で処理が終了するuser達にかかる時間をt2，Aの処理の合計時間と等しい時間で処理が終了するuserの人数をcnt，Aの処理の合計時間をt3とする．</p>
			<p>このとき，この処理が終了する時間の期待値は，</p>
			<p>t2 + (cnt - 1) * t3 / 2 + (t3 - t1) / 2 + t1</p>
			<p>となる．</p>
			<p>t2はほっといて，別の2項についての説明をしておく．</p>
			<h5>(cnt - 1) * t3 / 2</h5>
			<p>処理の1個目に入る確立はcnt分の1，先に行われる処理の数は0個．</p>
			<p>処理の2個目に入る確立はcnt分の1，先に行われる処理の数は1個．</p>
			<p>処理の3個目に入る確立はcnt分の1，先に行われる処理の数は2個．</p>
			<p>...</p>
			<p>よって，Aよりも先に行われる処理の数の期待値は，(0 ~ cnt-1の整数の合計値) / cntになる．</p>
			<p>(0 ~ cnt-1の整数の合計値) = cnt * (cnt - 1) / 2なので，上記の式は，</p>
			<p>(cnt - 1) / 2となる．</p>
			<h5>(t3 - t1) / 2</h5>
			<p>上と同じ考え方が使えそうだが，1回の処理時間がまちまちなので少々難しそう．</p>
			<p>1つの処理が生成する待ち時間の期待値を考えるほうが楽．(ここへの発想がなかった）</p>
			<p>同一userの処理の数をmとすると，</p>
			<p>処理の1個目に入る確立はm分の1，現在調べている処理がその後にはいる確立は(m-1) / (m-1)．</p>
			<p>処理の2個目に入る確立はm分の1，現在調べている処理がその後にはいる確立は(m-2) / (m-1).</p>
			<p>処理の3個目に入る確立はm分の1，現在調べている処理がその後にはいる確立は(m-3) / (m-1).</p>
			<p>...</p>
			<p>これらの合計値は，</p>
			<p>1/m * m * (m-1) / 2 / (m-1)</p>
			<p>約分すると1/2になる．</p>
			<p>最後のところ意外はちゃんと思いついたが，コーディングに時間がかかった．</p>
			<p>いろいろな処理を行うのに簡潔に書ける方法を思いつくって大事だよな．</p>
			<p>解説のコードを読んで目から鱗だった．</p>
<pre class="syntax-highlight">
<span class="synType">class</span> BatchSystemRoulette {
    <span class="synStatement">public</span>:
    vector &amp;#<span class="synConstant">60</span>;<span class="synType">double</span>&amp;#<span class="synConstant">62</span>; expectedFinishTimes(vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; duration, vector &amp;#<span class="synConstant">60</span>;string&amp;#<span class="synConstant">62</span>; user) {
        vector &amp;#<span class="synConstant">60</span>;<span class="synType">double</span>&amp;#<span class="synConstant">62</span>; res;
        <span class="synType">int</span> n = duration.size();
        map&amp;#<span class="synConstant">60</span>;string, <span class="synType">long</span> <span class="synType">long</span>&amp;#<span class="synConstant">62</span>; user_duration;
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
            user_duration[user[i]] += duration[i];
        }

        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
            <span class="synType">double</span> beforeTime = <span class="synConstant">0</span>;
            <span class="synType">int</span> cnt = <span class="synConstant">0</span>;
            <span class="synStatement">for</span>(map&amp;#<span class="synConstant">60</span>;string, <span class="synType">long</span> <span class="synType">long</span>&amp;#<span class="synConstant">62</span>;::iterator j=user_duration.begin(); j!=user_duration.end(); ++j){
                <span class="synStatement">if</span>(j-&amp;#<span class="synConstant">62</span>;second &amp;#<span class="synConstant">60</span>; user_duration[user[i]]){
                    beforeTime += j-&amp;#<span class="synConstant">62</span>;second;
                }
                <span class="synStatement">else</span> <span class="synStatement">if</span>(j-&amp;#<span class="synConstant">62</span>;second == user_duration[user[i]]){
                    ++cnt;
                }
            }
            <span class="synType">double</span> et = beforeTime
                            + (cnt - <span class="synConstant">1</span>) * user_duration[user[i]] / <span class="synConstant">2.0</span>
                            + (user_duration[user[i]] - duration[i]) / <span class="synConstant">2.0</span>
                            + duration[i];
            res.push_back(et);
        }
        <span class="synStatement">return</span> res;
    }
};
</pre>

		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Fri, 16 Sep 2011 06:20:05 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

		<item>
			<title>[SRM][Practice]SRM 517 Div1 Medium</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110916/1316132022</link>

			<description><![CDATA[
		<div class="section">
			<p>括弧内は本番で気がつくことのなかった反省点．反省点しかないとかいわない．</p>
			<h4>問題概要</h4>
			<p>0..N-1の整数で表される数列pがある．</p>
			<p>すべての整数k(0&lt;=k&lt;N-1)について，p[k]とp[k+1]を入れ替える操作を1回ずつ行い，pを昇順にソートしたい．&lt;/ppp&gt;
			<p>このとき，並べ替える方法は何通りあるか．</p>
			<h4>解法</h4>
			<p><a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][j]をi番目からj番目までの要素を昇順に並べ替える方法の数として<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/DP">DP</a>．(<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/DP">DP</a>の方針を間違えたので，重複が削除できなかった）</p>
			<p><a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][i] = 1</p>
			<p>t(i, j, k)をi番目からj番目までの要素を並べ替える方法のうち，k番目の要素とk+1番目の要素を最後に交換する方法の数とすると，<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][j]は，t(i, j, k) (i &lt;= k &lt; j)の和になる．</p>
			<p>t(i, j, k)は，数列をi~k, k+1~jまでの数列に分割して並べ替えた後，k番目の要素とk+1番目の要素を最後に入れ替えるというように考える．</p>
			<p>2つの数列を並べ替える方法はそれぞれ<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][k]，<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[k+1][j]で，その手順の数はk-i，j-(k+1)回．(ここに気がつかなかった）</p>
			<p>この2種類の手順を組み合わせて実行する．それぞれの手順は独立に考えることができるので，</p>
			<p>t(i, j, k) = C(j-i-1, k-i)*<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][k]*<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[k+1][j]（コンビネーションを使う発想がなかった．）</p>
			<p>当然すべて適用していいというわけではなく，i~jまでの要素を確実に昇順にソートしないといけない．</p>
			<p>上記の方法を適用して，i~jまでの数列をソートするには，</p>
			<p>p[i], p[i+1], .. , p[k-1], p[k+1], p[k], p[k+2], p[k+3], .. , p[j]が昇順である必要がある．</p>
			<p>つまり，p[i], p[i+1], .. , p[k-1], p[k+1]を昇順に並べ替えたときの結果と，p[i], p[i+1], .. , p[j]を昇順に並べ替えた結果のp[i] .. p[k]が等しいものだけを加算する．</p>
			<p>この計算量は，<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>を埋めるのにO(N^2)，各<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>[i][j]を計算するのにO(N)かかるので，O(N^3)．</p>
			<p>C(n, r)は，<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/dp">dp</a>で事前に求めておく．</p>
			<p>制約に合致するかどうかも事前に計算して配列に保存しておける．こちらはO(N^3logN)かかる．</p>
			<p>Nは最大でも50なので，log 50 / log 2 = 5.6...</p>
			<p>掲載するソースは，合致するかどうかいちいちソートして調べているので，O(N^4logN)．</p>
			<p>あと，再帰をメモ化するタイプの<a class="keyword" href="https://topcoder.g.hatena.ne.jp/keyword/DP">DP</a>です．漸化式をもとにループで計算している例は，TopCoderの解説にあります．</p>
<pre class="syntax-highlight">
<span class="synType">const</span> <span class="synType">int</span> DIV = <span class="synConstant">1000000007</span>;

<span class="synType">class</span> AdjacentSwaps {
    <span class="synStatement">public</span>:
    <span class="synType">int</span> c[<span class="synConstant">51</span>][<span class="synConstant">51</span>];
    <span class="synType">int</span> dp[<span class="synConstant">60</span>][<span class="synConstant">60</span>];
    <span class="synType">int</span> init(){
        memset(c, <span class="synConstant">0</span>, <span class="synStatement">sizeof</span>(c));
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;=<span class="synConstant">50</span>;++i){
            <span class="synStatement">for</span>(<span class="synType">int</span> j=<span class="synConstant">0</span>;j&amp;#<span class="synConstant">60</span>;=i;++j){
                <span class="synStatement">if</span>(j == <span class="synConstant">0</span> || j == i){
                    c[i][j] = <span class="synConstant">1</span>;
                }
                <span class="synStatement">else</span>{
                    c[i][j] = (c[i-<span class="synConstant">1</span>][j-<span class="synConstant">1</span>] + c[i-<span class="synConstant">1</span>][j]) % DIV;
                }
            }
        }
        memset(dp, -<span class="synConstant">1</span>, <span class="synStatement">sizeof</span>(dp));
    }
    <span class="synType">int</span> calc(<span class="synType">int</span> s, <span class="synType">int</span> e, vector&amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; &amp;#<span class="synConstant">38</span>;p){
        <span class="synStatement">if</span>(s == e){
            <span class="synStatement">return</span> <span class="synConstant">1</span>;
        }
        <span class="synStatement">if</span>(dp[s][e] &amp;#<span class="synConstant">62</span>;= <span class="synConstant">0</span>){
            <span class="synStatement">return</span> dp[s][e];
        }
        dp[s][e] = <span class="synConstant">0</span>;
        <span class="synStatement">for</span>(<span class="synType">int</span> k=s;k&amp;#<span class="synConstant">60</span>;e;++k){
            <span class="synType">bool</span> flag = <span class="synConstant">true</span>;
            vector&amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; v(p), w(p);
            sort(v.begin() + s, v.begin() + (e + <span class="synConstant">1</span>));
            sort(w.begin() + s, w.begin() + (k + <span class="synConstant">1</span>));
            <span class="synStatement">for</span>(<span class="synType">int</span> i=s;i&amp;#<span class="synConstant">60</span>;k;++i){
                flag = flag &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; v[i] == w[i];
            }
            flag = flag &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; v[k+<span class="synConstant">1</span>] == w[k];
            <span class="synStatement">if</span>(!flag){
                <span class="synStatement">continue</span>;
            }
            <span class="synType">int</span> l = calc(s, k, p);
            <span class="synType">int</span> r = calc(k+<span class="synConstant">1</span>, e, p);
            <span class="synType">int</span> t = ((<span class="synType">long</span> <span class="synType">long</span>)l * r) % DIV;
            t = ((<span class="synType">long</span> <span class="synType">long</span>)t * c[e-s-<span class="synConstant">1</span>][k-s]) % DIV;
            dp[s][e] = (t + dp[s][e]) % DIV;
        }
        <span class="synStatement">return</span> dp[s][e];
    }
    <span class="synType">int</span> theCount(vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; p) {
        <span class="synType">int</span> res;	
        <span class="synType">int</span> n = p.size();
        init();
        res = calc(<span class="synConstant">0</span>, n-<span class="synConstant">1</span>, p);
        <span class="synStatement">return</span> res;
    }
};
</pre>

		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Fri, 16 Sep 2011 00:13:42 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

		<item>
			<title>[SRM][Practice]SRM337 Div1 Easy,Medium</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110906/1315325080</link>

			<description><![CDATA[
		<div class="section">
			<p>新しいPC使って始めてのPractice．</p>
			<p>337のPracticeには2人ほど付き合ってくださった．感謝．</p>
			<h4>Easy概要</h4>
			<p>1から1000000のカードまたはジョーカー（ワイルドカード）が最大50枚配られる．</p>
			<p>それらを使って階段を作りたい．</p>
			<p>最長でどれだけの長さの階段が作れるか．</p>
			<h4>Easy方針</h4>
			<p>高々50枚なので，最長で50の階段．カードの数も1000000までなので，始点を定めてそこからどれだけの長さの階段ができるか調べる．</p>
<pre class="syntax-highlight">
<span class="synType">int</span> tab[<span class="synConstant">10000010</span>];
<span class="synType">class</span> CardStraights {
    <span class="synStatement">public</span>:
    <span class="synType">int</span> longestStraight(vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; cards) {
        <span class="synType">int</span> res = <span class="synConstant">0</span>;
        <span class="synType">int</span> joker = <span class="synConstant">0</span>;
        <span class="synType">int</span> n = cards.size();
        memset(tab, <span class="synConstant">0</span>, <span class="synStatement">sizeof</span>(tab));
        sort(cards.begin(), cards.end());
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
            <span class="synStatement">if</span>(cards[i] == <span class="synConstant">0</span>){
                joker++;
            }
            <span class="synStatement">else</span>{
                tab[cards[i]]++;
            }
        }
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">1</span>;i&amp;#<span class="synConstant">60</span>;=<span class="synConstant">1000000</span>;++i){
            <span class="synType">int</span> tmp = joker;
            <span class="synType">int</span> count = <span class="synConstant">0</span>;
            <span class="synStatement">for</span>(<span class="synType">int</span> j=i;j&amp;#<span class="synConstant">60</span>;=<span class="synConstant">1000000</span>;++j){
                <span class="synStatement">if</span>(tab[j] == <span class="synConstant">0</span>){
                    <span class="synStatement">if</span>(tmp &amp;#<span class="synConstant">62</span>; <span class="synConstant">0</span>){
                        --tmp;
                    }
                    <span class="synStatement">else</span>{
                        <span class="synStatement">break</span>;
                    }
                }
                ++count;
            }
            res = max(count, res);
        }
        <span class="synStatement">return</span> res;
    }
};
</pre>

			<h4>Medium概要</h4>
			<p>高さがまちまちのビルがある．その壁面に長方形の広告を載せたい．</p>
			<p>最大でどれだけの面積の広告を貼り付けられるか．</p>
			<h4>Medium方針</h4>
			<p>各地点でのx座標と高さをスタックに積みながら進む．</p>
			<p>途中で，スタックに積んでいる高さよりも低いものが現れたら，面積を計算しながらスタックからおろして面積を計算．（その地点の高さより小さくなるまで続ける．）その後にスタックに積む．（最後におろしたスタックのx座標を使う）</p>
			<p>これを続けていって，最大値が答え．</p>
<pre class="syntax-highlight">
<span class="synType">class</span> BuildingAdvertise {
    <span class="synStatement">public</span>:
    <span class="synType">void</span> getR(vector&amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; h, <span class="synType">int</span> n, vector&amp;#<span class="synConstant">60</span>;<span class="synType">long</span> <span class="synType">long</span>&amp;#<span class="synConstant">62</span>; &amp;#<span class="synConstant">38</span>;R){
        <span class="synType">int</span> j = <span class="synConstant">0</span>;
        <span class="synType">int</span> m = h.size();
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>; i&amp;#<span class="synConstant">60</span>;n; ++i){
            R.push_back(h[j]);
            <span class="synType">int</span> s = (j + <span class="synConstant">1</span>) % m;
            h[j] = ((h[j] ^ h[s]) + <span class="synConstant">13</span>) % <span class="synConstant">835454957</span>;
            j = s;
        }
    }
    <span class="synType">long</span> <span class="synType">long</span> getMaxArea(vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; h, <span class="synType">int</span> n) {
        <span class="synType">long</span> <span class="synType">long</span> res = <span class="synConstant">0ll</span>;
        vector&amp;#<span class="synConstant">60</span>;<span class="synType">long</span> <span class="synType">long</span>&amp;#<span class="synConstant">62</span>; R;
        stack&amp;#<span class="synConstant">60</span>;pair&amp;#<span class="synConstant">60</span>;<span class="synType">int</span>, <span class="synType">int</span>&amp;#<span class="synConstant">62</span>; &amp;#<span class="synConstant">62</span>; st;
        getR(h, n, R);
        st.push(make_pair(<span class="synConstant">0</span>, <span class="synConstant">0</span>));
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
            <span class="synStatement">if</span>(R[i] &amp;#<span class="synConstant">60</span>; st.top().second){
                <span class="synType">int</span> last = <span class="synConstant">0</span>;
                <span class="synStatement">while</span>(R[i] &amp;#<span class="synConstant">60</span>; st.top().second){
                    res = max(res, (<span class="synType">long</span> <span class="synType">long</span>)(i - st.top().first) * st.top().second);
                    last = st.top().first;
                    st.pop();
                }
                st.push(make_pair(last, R[i]));
            }
            <span class="synStatement">else</span> <span class="synStatement">if</span>(R[i] &amp;#<span class="synConstant">62</span>; st.top().second){
                st.push(make_pair(i, R[i]));
            }
        }
        <span class="synStatement">while</span>(!st.empty()){
            res = max(res, (<span class="synType">long</span> <span class="synType">long</span>)(n - st.top().first) * st.top().second);
            st.pop();
        }
        <span class="synStatement">return</span> res;
    }
};
</pre>

			<p>hという配列から高さを表すRを作るという制約を忘れていて，一緒に練習していた人に指摘された．すごく恥ずかしかった．</p>
		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Tue, 06 Sep 2011 16:04:40 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

		<item>
			<title>[SRM][Practice]SRM 493 Div1 Easy</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110903/1315052614</link>

			<description><![CDATA[
		<div class="section">
			<h4>概要</h4>
			<p>N個の石が1列にあって，M番目の石が白，他はすべて黒になっている．</p>
			<p>2人のプレイヤーが交互にK個の連続した石を選んで，その順番を入れ替える．</p>
			<p>先にL番目の位置に白い石を配置したほうが勝ち．</p>
			<p>どちらのプレイヤーが勝つか求める．（いつまでたっても終わらない場合は引き分け）</p>
			<h4>解法</h4>
			<p>初手でLに移動させられたら，先手の勝ち．</p>
			<p>2手目で確実にLに移動させられたら，後手の勝ち．</p>
			<p>3手以上かかる場合は，相手と同じ動きをして，無限ループに落としこむことができるので，引き分け．</p>
<pre class="syntax-highlight">
<span class="synType">class</span> StonesGame {
<span class="synStatement">public</span>:
    <span class="synType">bool</span> can(<span class="synType">int</span> N,<span class="synType">int</span> M, <span class="synType">int</span> K, <span class="synType">int</span> L){
        <span class="synType">int</span> num = max(L, M) - min(L, M) + <span class="synConstant">1</span>;
        <span class="synStatement">if</span>(num % <span class="synConstant">2</span> != K % <span class="synConstant">2</span>) <span class="synStatement">return</span> <span class="synConstant">false</span>;
        <span class="synType">int</span> t = (K - num) / <span class="synConstant">2</span>;
        <span class="synStatement">if</span>(t &amp;#<span class="synConstant">60</span>; <span class="synConstant">0</span>) <span class="synStatement">return</span> <span class="synConstant">false</span>;
        <span class="synStatement">return</span> min(M, L) - t  &amp;#<span class="synConstant">62</span>;= <span class="synConstant">0</span> &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; max(M, L) + t &amp;#<span class="synConstant">60</span>; N;
    }
    string winner(<span class="synType">int</span> N, <span class="synType">int</span> M, <span class="synType">int</span> K, <span class="synType">int</span> L) {
        <span class="synType">bool</span> win;
        M = M - <span class="synConstant">1</span>; L = L - <span class="synConstant">1</span>;
        <span class="synStatement">if</span>(can(N, M, K, L)) <span class="synStatement">return</span> <span class="synConstant">&quot;Romeo&quot;</span>;
        win = <span class="synConstant">true</span>;
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i+K&amp;#<span class="synConstant">60</span>;=N;++i){
            <span class="synType">int</span> next;
            <span class="synStatement">if</span>(i + K &amp;#<span class="synConstant">60</span>;= M)
                <span class="synStatement">continue</span>;
            <span class="synStatement">if</span>(M &amp;#<span class="synConstant">60</span>; i)
                <span class="synStatement">continue</span>;
            next = i + K - (M - i) - <span class="synConstant">1</span>;
            win = win &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; can(N, next, K, L);
        }
        <span class="synStatement">return</span> win ? <span class="synConstant">&quot;Strangelet&quot;</span>: <span class="synConstant">&quot;Draw&quot;</span>;
    }
};
</pre>

		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Sat, 03 Sep 2011 12:23:34 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

		<item>
			<title>[SRM][Practice]SRM492 Div1 Easy</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110903/1315030314</link>

			<description><![CDATA[
		<div class="section">
			<h4>概要</h4>
			<p>木の高さが一直線上に並ぶようにそろえる．</p>
			<p>主人公は時間を巻き戻せるので，木は短くすることができる．</p>
			<p>最小でいくつの木を短くすればいいだろうか．</p>
			<h4>解法</h4>
			<p>全探索．</p>
			<p>2本の木を順番に選んで，いくつ木を短くすればいいか調べる．</p>
<pre class="syntax-highlight">
<span class="synPreProc">#define EPS (</span><span class="synConstant">1e-10</span><span class="synPreProc">)</span>
<span class="synType">class</span> TimeTravellingGardener {
<span class="synStatement">public</span>:
    <span class="synType">int</span> determineUsage(vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; distance, vector &amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; height) {
        <span class="synType">int</span> n = height.size();
        <span class="synType">int</span> res = n - <span class="synConstant">1</span>;
        vector&amp;#<span class="synConstant">60</span>;<span class="synType">int</span>&amp;#<span class="synConstant">62</span>; v;
        v.push_back(<span class="synConstant">0</span>);
        <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
            v.push_back(v[i] + distance[i]);
        }
        <span class="synStatement">for</span>(<span class="synType">int</span> a=<span class="synConstant">0</span>;a&amp;#<span class="synConstant">60</span>;n;++a){
            <span class="synStatement">for</span>(<span class="synType">int</span> b=<span class="synConstant">0</span>;b&amp;#<span class="synConstant">60</span>;n;++b){
                <span class="synType">double</span> t = <span class="synType">double</span>(height[b] - height[a]) / (v[b] - v[a]);
                <span class="synType">double</span> s = height[a] - t * v[a];
                <span class="synType">int</span> cnt = <span class="synConstant">0</span>;
                <span class="synType">bool</span> flag = <span class="synConstant">true</span>;
                <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;n;++i){
                    <span class="synStatement">if</span>(s + t * v[i] &amp;#<span class="synConstant">60</span>; - EPS){
                        flag = <span class="synConstant">false</span>;
                    }
                    <span class="synStatement">else</span> <span class="synStatement">if</span>(height[i] - EPS &amp;#<span class="synConstant">60</span>; s + t * v[i] &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; s + t * v[i] &amp;#<span class="synConstant">60</span>; height[i] + EPS){
                    }
                    <span class="synStatement">else</span> <span class="synStatement">if</span>(height[i] + EPS &amp;#<span class="synConstant">62</span>; s + t * v[i]){
                        ++cnt;
                    }
                    <span class="synStatement">else</span>{
                        flag = <span class="synConstant">false</span>;
                    }
                }
                <span class="synStatement">if</span>(flag) res = min(cnt, res);
            }
        }
        <span class="synStatement">return</span> res;
    }
};
</pre>

		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Sat, 03 Sep 2011 06:11:54 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

		<item>
			<title>[SRM][Practice]SRM494 Div1 Easy</title>
			<link>https://topcoder.g.hatena.ne.jp/blue_jam/20110903/1315027406</link>

			<description><![CDATA[
		<div class="section">
			<h4>概要</h4>
			<p>ピクセルの情報が与えられるので，それを塗りつぶすことができる最大のブラシの大きさを求める．</p>
			<h4>解法</h4>
			<p>O(min(W,H) * (WH)^2)で全部ぬって確かめる．</p>
			<p>O(WH)でいけない気がしなくもない．</p>
			<p>なんかすごい時間かかった．</p>
<pre class="syntax-highlight">
<span class="synType">class</span> Painting {
<span class="synStatement">public</span>:
    <span class="synType">int</span> largestBrush(vector &amp;#<span class="synConstant">60</span>;string&amp;#<span class="synConstant">62</span>; picture) {
        <span class="synType">int</span> w, h;
        <span class="synType">bool</span> checked[<span class="synConstant">60</span>][<span class="synConstant">60</span>];
        w = picture[<span class="synConstant">0</span>].size(); h = picture.size();
        <span class="synStatement">for</span>(<span class="synType">int</span> k=<span class="synConstant">1</span>;k&amp;#<span class="synConstant">60</span>;=min(w,h);++k){
            <span class="synType">bool</span> filled;
            memset(checked, <span class="synConstant">0</span>, <span class="synStatement">sizeof</span>(checked));
            <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i+k&amp;#<span class="synConstant">60</span>;=h;++i){
                <span class="synStatement">for</span>(<span class="synType">int</span> j=<span class="synConstant">0</span>;j+k&amp;#<span class="synConstant">60</span>;=w;++j){
                    <span class="synType">bool</span> flag = <span class="synConstant">true</span>;
                    <span class="synStatement">for</span>(<span class="synType">int</span> ti=<span class="synConstant">0</span>;ti&amp;#<span class="synConstant">60</span>;k;++ti){
                        <span class="synStatement">for</span>(<span class="synType">int</span> tj=<span class="synConstant">0</span>;tj&amp;#<span class="synConstant">60</span>;k;++tj){
                            <span class="synStatement">if</span>(picture[i+ti][j+tj] == <span class="synConstant">'W'</span>){
                                flag = <span class="synConstant">false</span>;
                            }
                        }
                    }
                    <span class="synStatement">if</span>(flag){
                        <span class="synStatement">for</span>(<span class="synType">int</span> ti=<span class="synConstant">0</span>;ti&amp;#<span class="synConstant">60</span>;k;++ti){
                            <span class="synStatement">for</span>(<span class="synType">int</span> tj=<span class="synConstant">0</span>;tj&amp;#<span class="synConstant">60</span>;k;++tj){
                                checked[i+ti][j+tj] = <span class="synConstant">true</span>;
                            }
                        }
                    }
                }
            }
            filled = <span class="synConstant">true</span>;
            <span class="synStatement">for</span>(<span class="synType">int</span> i=<span class="synConstant">0</span>;i&amp;#<span class="synConstant">60</span>;h;++i){
                <span class="synStatement">for</span>(<span class="synType">int</span> j=<span class="synConstant">0</span>;j&amp;#<span class="synConstant">60</span>;w;++j){
                    <span class="synStatement">if</span>(picture[i][j] == <span class="synConstant">'B'</span> &amp;#<span class="synConstant">38</span>;&amp;#<span class="synConstant">38</span>; !checked[i][j]){
                        filled = <span class="synConstant">false</span>;
                    }
                }
            }
            <span class="synStatement">if</span>(!filled) <span class="synStatement">return</span> k - <span class="synConstant">1</span>;
        }
        <span class="synStatement">return</span> min(h, w);
    }
};
</pre>

		</div>
]]></description>

			<dc:creator>blue_jam</dc:creator>

			<pubDate>Sat, 03 Sep 2011 05:23:26 GMT</pubDate>


			<category>SRM</category>

			<category>Practice</category>


		</item>

	</channel>
</rss>
