自分にとって、新たな知見が得られた問題をメモ。そのような問題に10問以上出会うこと。--コメント2013-09-019月に解いた問題8月試してみてモチベ向上につながったので続けます。自由に置ける数字と、そうでない数字に分けて考える。大きなbitを諦めると、下位のbitを任意に調整できることを利用する。左のヘッドから貪欲に進めていく。左に行ってから戻るパターンと、その逆のパターンがある。自分を含む子と、それ以外の頂点でそれぞれ最も遠い感染地を管理。どの頂点をどの子につけるかで全探索。素因数はなるべく細かく分解したほうがオトク。条件を読み解くと、限られた形のグラフしか許可していないことが分かる。各頂点の次数させ分かれば答えが出る。グラフは作らなくて良い。アリスでもボブでも作れない三角形は、アリスの方にある辺が1つか2つと考える。出現順に同じ数字を区別する。人間を半分に分け、それぞれチームを組ませると問題が半分になる。後ろから考えて、なるべく同じ向きが連続するように重ねていく。辺の重みでソートし、同じコストの辺をまとめて考える。dp2[i][k]2.は一見O(N*5000)かかるようだが工夫するとO(N+L)に落ちる。(O(n^3))に思えるが実は罠が。ウイルス文字列と不一致の場合、どの位置まで戻る必要があるかを前計算。貪欲にmodを取ったとき大きい数を使う。prefixとsuffixのハッシュを計算し、prefix=suffixとなる長さを探す。右上or左上から操作していく。10^18以下のフィボナッチ数は90ぐらいしかない。数を貪欲にフィボナッチ数に分解し、更にそれらをDPして分けていく。座標圧縮して二分木を作る。(1,2,4)と(1,3,6)を先に使い、残りで(1,2,6)の組を作ると考える。回路をほどくとは、隣り合う+か-をなくして、空きを詰める操作に相当。1)bを満たす最大のnを見つける問題になる。最終的に現れる数字のセットは、操作の仕方に寄らない。学生の時ほどプログラミングコンテストにかける時間が取れなくなった。三角形の足し算と引き算で各々の面積が求まる。各国同士の年号のズレの許容範囲をヒントを元に更新。パターン数は多くなく、全列挙できるレベル。うまい実装の仕方を見つけたい。実験すると有効解が少ないことに気づく。石を置くとゲームが2つの独立した状態に分かれる。少なくともひとつは区間Lの水を受ける。文字が被るwのパターンは少ないことを利用する。0から順番に入れていく。木Aと木Bから頂点を2つずつ選ぶと閉路が定まる。区間で考えるとうまくいく。ゲームの状態は(位置,今いるy座標での壁の区間)で表せる。現在考えている位置の2つ前までの狼まで覚えておけばいい。若干反則臭いがBitSet使ってO(N^3)でACできた。黒マスからは片方ずつに手が伸びる形になる。実装するだけだが制限時間が厳しいビット演算やループの展開などを利用して高速化を図る。iの石を取ると倍数の石も取る。[0,i)までの区間でj個穴を覆う時の最小コスト次に使う区間はn通りを試せば十分。各頂点を根にして木を再構築する。2つ目の配置の影響はその頂点と根の間にしか発生しないためどこに置けば反転を多く解消できるか適当にDPする。2つのギアの色の回転方向が同じと考え、2部グラフを作る。文字の種類数が最大で同じ文字が連続する。答えを決め打ちして二分探索。大きい方を小さい方に足すことを繰り返せばOK。素数列挙+いもす法+二分探索コメント2012-05-28ARC003久々にコンテストの参加レポート。足して、平均を取るだけ。反転した文字列を突っ込む。StringBuffer(S).reverse().toString()ソートする。Collections.sort()順番に出力。なっておそらく間に合わない。