mayoko’s diary

プロコンとかいろいろ。

2015-11-01から1ヶ月間の記事一覧

SRM 492 div1 easy:TimeTravellingGardener

昔の easy は簡単(最初に考えた方針が間違えていて, しかもサンプルが無かったら絶対 WA してた)。 問題 TopCoder Statistics - Problem Statement 解法 n = (木の本数) とします。 まず, 答えが n-1 以下になることは明らかです。一番低い木に合わせて他の…

SRM 493 div1 med:AmoebaCode

問題 TopCoder Statistics - Problem Statement 解法 気づくべきなのは一つで, 答えは必ず K 以下になる, ということです。かっこ良く言うと鳩の巣原理からわかりますが, まぁ明らかでしょう。 ということで, dp[n][state] = n 番目の文字を見ている時点で, …

SRM 493 div2 hard: CrouchingAmoebas

問題 TopCoder Statistics - Problem Statement 解法 正方形を作る際, 左下の点を決定すれば, どのような正方形になるかは一意に決まります。ということで, 左下の点がどこに来る可能性があるのかを考えると, これは各 (x[i], y[j]) (0 こころとしては, 位置…

SRM 493 div1 easy: StonesGame

SRM 400 番台の easy は簡単(ホントか) 問題 TopCoder Statistics - Problem Statement 解法 まず, 一回の白石の移動で目的の場所まで動かせたら Romeo の勝ちです。そうでない場合は, Romeo は負けないように動かします。どんなふうに石を動かしても次に St…

SRM 494 div2 hard, div1 med:AlternatingLane

してやられた!という感じです。 問題 TopCoder Statistics - Problem Statement 解法 当然すべての場合を考えていると間に合わないので, 見方を変えます。ランダムに選ばれた結果, 木の高さがそれぞれ h[0], h[1], ..., h[n-1] になったとします。 整数の組…

SRM 494 div1 easy:Painting

昔の SRM は easy は簡単(と言いつつ少し迷いましたが)なのであんまり書く意味が無いような気もしないでもない。 問題 TopCoder Statistics - Problem Statement 解法 あるサイズ S で塗れるのであれば, それより小さいサイズでも塗ることが出来るのは明らか…

SRM 526 div1 med:PrimeCompositeGame

問題 TopCoder Statistics - Problem Statement 解法 K が小さければ, dp[n][t] = (t の人が数を変更する番の時, 残りの数が n であった場合の, 求める数) という dp で解けます。求める数というのは, もし t が勝てる場合は, 最小ターン数を, 負ける場合は …

SRM 673 div1 med:BearPermutations

問題 TopCoder Statistics - Problem Statement 解法 さっきと同じように dp を考えます。dp[n][s] = (長さ n の数列で, スコアの合計が s であるようなものの数) という dp が自然な気がしますが, 今回の dp では最小要素がどこにあるのか, という情報も必…

SRM 673 div2 hard:BearPermutations2

問題 TopCoder Statistics - Problem Statement 解法 cartesian tree で注目すべき特徴は, ・数列の最小の要素が cartesian tree の一番上に来る ・最小の要素を中心に, 数列は左側と右側に分かれる ・で, 左側と右側でまた cartesian tree が出来るというこ…

SRM 526 div1 easy:DucksAlignment

問題 TopCoder Statistics - Problem Statement 解法 まず, あつまるべき座標を決定した際にそれぞれのアヒルはどのように動かすのが最適かを考えてみましょう。各行にはたかだか 1 匹のアヒルしかいないので, ある一列にアヒルを揃える際は, (a, c), (a+1, …

yukicoder No.307 最近色塗る問題多くない?

問題 No.307 最近色塗る問題多くない? - yukicoder 解法 すべての盤面が一色になるまでは各クエリごとに幅優先探索をして愚直に色を変えていき, すべての盤面が一色になったら各クエリごとに全体の色が変わることを O(1) で記憶しておけば良いです。計算量…

CODE FESTIVAL 2015 あさぷろ Middle C - 一次元オセロ

あさプロの時はものすごく混乱してて結局解けなかったんだけど, 今やったらめっちゃあっさりだった。 問題 code-festival-2015-morning-middle.contest.atcoder.jp 解法 N は奇数なので, 最後にすべてのコマが同じ色になる時コマは絶対に白色になっています…

CODE FESTIVAL 2015 あさぷろ Middle B - ヘイホー君と削除

いつ追加されるんだろうとずっと思ってたけどやっと追加されたので解きます。 問題 code-festival-2015-morning-middle.contest.atcoder.jp 解法 繰り返す文字列は左側と右側に分かれるので, 左からの i 文字と残りの右側 n-i 文字でなるべく長い, 一致する…

JAG Practice Contest for ACM-ICPC Asia Regional 2015 F - Modern Announce Network

この問題好き(だけどプロの人は典型とか言いそう)。 問題 jag2015autumn.contest.atcoder.jp 解法 考えやすくするために「1年生の集合」「2年生の集合」「3年生の集合」という集合を表した頂点(これらを A, B, C とする)を考えます。すると, 求めるべきなの…

Codeforces Round #333 (Div. 1) C. Kleofáš and the n-thlon

問題 codeforces.com 解法 Kleofáš のランクの合計が S であるとしましょう。すると, 結局求めるべきなのは n 試合終わった後にランクの合計が S 未満であるような人の数の期待値です。ということで, 以下のような dp を考えます。dp[i][j] = (i 試合終わっ…

Codeforces Round #333 (Div. 1) B. Lipshitz Sequence

問題 codeforces.com 解法 i と j が 2 以上離れている整数の組(i, j) について, |h[i]-h[j]|/|i-j| が L(h) として採用されることは無いです。つまり, i と i+1 について, |h[i+1]-h[i]| という値のみ考えれば良く, 他の値は無視して構わないです。あとやる…

Codeforces Round #333 (Div. 1) A. The Two Routes

問題 codeforces.com 解法 ごちゃごちゃ書いてますが, 一つのルートでは目的地まで距離 1 で行けて, もうひとつのルートでは距離 1 で行けないので, 何も考えず2つのルートの最短経路の最大値を取れば良いだけです。 struct edge { int v; ll w; edge() {} …

Codeforces Round #333 (Div. 2) B. Approximating a Constant Range

Codeforces Round #333 (Div. 2) に参加しました。D 解きたかった〜〜〜〜〜〜〜〜〜〜 問題 codeforces.com 解法 しゃくとり法的にやります。しゃくとり法のやり方はいろいろあったと思いますが, 僕はセグメント木でやりました。seg1[l, r] = (区間[l, r] …

JAG Practice Contest for ACM-ICPC Asia Regional 2015 C - Delete Files

問題 jag2015autumn.contest.atcoder.jp 解法 長さが短いものから順に処理していきます。 処理するときは, その手前のファイル, それより後のファイルをどれだけ消せるかを確かめていけば良いです。要するに貪欲法ですが, 小さい順に消していけば, 「消せる…

JAG Practice Contest for ACM-ICPC Asia Regional 2015 D - Line Gimmick

問題 jag2015autumn.contest.atcoder.jp 解法 各場所よりも右にある "" の数を数えると, 最終的にどちら側にたどり着くかがわかります。 例えば >>> という文字列を考えた時, 左から 4 番目にある文字 "" の数は 2 つで, これより右側にある " こんな感じで,…

JAG Practice Contest for ACM-ICPC Asia Regional 2015 B - Change a Password

問題 jag2015autumn.contest.atcoder.jp 解法 N! 通りの全探索をするだけです。 ll calc(const string& s, const string& t) { int n = s.size(); ll p = 1; for (int i = 0; i < n; i++) p *= 10; ll S = stoll(s), T = stoll(t); ll tmp = abs(S-T); retur…

JAG Practice Contest for ACM-ICPC Asia Regional 2015 A - M and A

問題 jag2015autumn.contest.atcoder.jp 解法 S からは交互に文字を取っていくことになるので, 要するに焦点となるのは, 「S から 1 つおきに文字を取っていったもの(s とする)と, T の部分文字列とで, 最長共通部分文字列が s に一致するかどうか」というこ…

Saiko~ No Contesuto #03 歯車と箱

問題 www.hackerrank.com 解法 明らかに上半分を掛け算する方に使って下半分を割り算に使ったほうが得になります。ということで, この場合の分数の値を出力すればよいですが, C++ ではこれが面倒です。これをやるためには, 下半分の掛け算と上半分の掛け算の…

素因数分解について

前々から書く時ちょっと迷うことがあったのでメモ。整数 の素因数分解を O() でやります。 void calc(ll x, map<ll, int>& M) { for (ll i = 2; i*i <= x; i++) { int cnt = 0; while (x%i == 0) { x /= i; cnt++; } if (cnt) M[i] += cnt; } if (x > 1) M[x] += 1; }</ll,>

Codeforces Round #332 (Div. 2) D. Spongebob and Squares

こういう問題でギリギリ攻められるのあんまり好きじゃないんですが… まぁこの問題の場合だとまだ仕方ないかなって感じしますけど… 問題 codeforces.com 解法 m m*n + (m-1)*(n-1) + ... + 1 * (n-m+1) となります。そこで, m の値を決め打ちして, n の値が存…

AtCoder Beginner Contest 031 D - 語呂合わせ

問題 abc031.contest.atcoder.jp 解法 n 番目の v, w の対応では各数字がどのような文字列に対応しているか, というのを深さ優先探索すれば OK です。具体的な実装は, dfs(m, num, cur, S) = 「n 番目の v, w の対応を調べているが, v の方は num 番目の数字…

Codeforces Round #332 (Div. 2) C. Day at the Beach

出る気まんまんだった Codeforces Round #332 (Div. 2) は寝坊。 問題 codeforces.com 解法 ある区間 [l, r] でソートしてやるだけで全体をちゃんとソートしたことになるためには, [0, r] に含まれる数が, 全体で見た時に [0, r] 番目の数のみで構成されてい…

Codeforces Round #206 (Div. 1) E. Lucky Number Representation

問題 codeforces.com 解法 桁 DP するだけです。dp[keta][carry] = (keta 目の桁で, 繰り上がりが carry であるような場合に, 和を N にするような 6 つの数字が存在するか)みたいなことをやります。各状態では, 6 つの数字を 0, 4, 7 のどれにするかを 3^6 …

Codeforces Round #206 (Div. 1) B. Game with Strings

問題 codeforces.com 解法 まず, 問題文をちゃんと把握します。 普通の問題と違って, この問題の場合だと, それまでに通ってきた文字列が一致していれば, 自分のターンに遷移させるマスが変わっても良いというのがポイントです。 と言ってもアレなので例を挙…

Codeforces Round #206 (Div. 1) A. Vasya and Robot

問題 codeforces.com 解法 左からいくつの荷物を取るかで全探索します。左から i 個の荷物を取るとすると, 「連続して同じ手を使うとコストが増える」というのを無視した場合かかるコストは l * (w[0]+w[1]+...+w[i-1]) + r * (w[i]+...+w[n-1]) となります…