olpheの競プロ帖

競プロ問やアルゴリズム等の考察します

DDCC2017参加記

前泊ダメだよとのことだったので朝5時ぐらいにお家を出て新幹線で東京に向かうことに。ほぼ始発だったのでめちゃくちゃ混んでて怖いね。

品川でりかちゃんとうしさんと合流して大森海岸へ、

 

 途中偶然TABさんと遭遇したりしていた。

どうでもいいんですが、たぶさんとたぷさんって似てるね。

 

朝食後会場に向かい、Tシャツが強制着用だったので着替えたら結構寒かった。

しばらく時間があったのでサイン帖を埋めていた。みんなありがとう。

 

コンテストはAB解いた時点で7位ぐらいで、Cが800なんで50には入ったかな~と思いつつCの考察へ、なんか何も見えなかったのでMMの気持ちになったら終了2分前に解けたので喜んでいた。結果は30位でした。(3位の人も同じく1600点だったのでもうちょっと頑張っていれば…とか思ったり)

非常に集中していたのか終了直後に軽めの脳貧血を起こしてア。

 

昼食はTIkeさんとらてあさんと食べながらうろついていたら大所帯になっていて全員は把握できていないんですが、eiyaさんとかAzさんとかつたじろうさんとかりかちゃんとかyazatenさんとかがいた気がする。

その後いろんな人とCの解法についてしゃべってたけど何もわからなかった。復習しましょう。

 

対談は面白いな~と思いながら聞いていました。

僕が学生の間にtouristを負かすAIとか出てくると思うんだけどどうなんだろう。

まあアルゴリズムとかきれいだな~みたいな感じなので続けるんだろうなあとぼんやりと思っていたりもした。

 

 

社内見学のハイライトです。

 

日本企業に対する偏見が強かったので正直あまり真剣に見るつもりはなかったのですが、福利厚生がしっかりしているなあと思ってちょっと安心した。ほかの企業も充実してるといいな。

 

夕食時は主にアルゴンさんとみなみさんとICPC頑張りたいなあみたいな話をしていた。ICPC頑張りたいなあ。

 

終了後ボーリングしてたんですが、あれ難しすぎませんか。

 

らてあさんと一緒に京都まで帰ってきてDDCCは終了でした。

 

すごく楽しかったのでオンサイトたくさん出たいね。次はRUPCに出られたらいいなあ。

Marathon Match 95

画像が与えられるので、指定された数の半透明な円を描いていって元の画像に近づけようという問題。

作成途中の画像の状態だけが重要で配置の順番はどうでもいいと思ったのでビームサーチ案を捨て、貪欲に円を配置していくことを考えた。

貪欲パートは、ランダムな位置にランダムな大きさ(大きさは進度に依存する)の円を描くことを考えたときに、変更前、後の各RGB成分の平均を取り、そこから求めた色を塗ることとした。

外側重視とか画像の隣接するマスの近似度とかを使おうと思っていろいろやっていたけどそちらはうまくいかなかった。(最終的に円は小さいので外側重視に意味があまりない?)(思いついたのが最終日の2時ごろなので時間がなかった)

0)1.2455719E7

1)1.6093684E7

2)2.5773614E7

3)1.1478683E7

4)7802575.0

5)1.1083905E7

6)4.0074287E7

7)2.4999824E7

8)1.981949E7

9)3.5520464E7

MM/MM95_loop.cpp at master · olphe/MM · GitHub

Codeforces Round #435 (Div. 2)

ABDの3完で239位

 

A問題

数字の数と作りたいMEX,N個の数が与えられる。数字を出現させたり消したりしてMEXを指定の数にしたい。

配列を用意して舐めてあげればよいです。

http://codeforces.com/contest/862/submission/30502250

 

B問題

木が与えられる。二部グラフのまま辺を追加したいとき、何本足せるかな?

距離を求めて各頂点がどっちの領域にあるか求めてから引き算すればよい。

http://codeforces.com/contest/862/submission/30514174

 

D問題

0と1からなる文字列が与えられる。文字列を出力するとハミング距離が分かるので、0の場所と1の場所を一個でいいのであてよう。

まず000..と1000..を出力し、先頭の文字を確定させる。その後、もう一個の文字を探してにぶたんする。

http://codeforces.com/contest/862/submission/30512775

  Codeforces Round #434 (Div. 1, based on Technocup 2018 Elimination Round 1)

3完99位

Unratedめ…

 

A問題

文字列が与えられる。その中に2種類以上の子音が3個並んでいたら切る問題。

切る回数を最小にしたい。

前から貪欲に調べていって条件を満たし次第切ればよい。

貪欲なのでO(N)

http://codeforces.com/contest/860/submission/30422539

 

B問題

電話番号がたくさん与えられる。それらを連続部分列で識別する場合、各電話番号について一位に定まり且つ最も短い連続部分列を求める問題。

まず全ての連続部分列を求めておく。その後各電話番号について連続部分列を求め、あらかじめ求めたものと見比べればよい。mapで殴る。

O(N(logN)^2)だと思うけど定数倍がでかい。

http://codeforces.com/contest/860/submission/30428030

 

C問題

たくさんの文字列とその文字列が全体の中で前に来るか後に来るかの情報が与えられる。最終的に文字列を1~Nまでの数字に置き換えつつ並び順も正しくしたい。

まず、数字としては正しいが位置が間違っているものを探し出し、それらを優先的に移動させる。その後、関係のないものを移動させる。

ただし、移動させられない場合は間違った場所にあるものを一度変な名前に変えてやるとよい。セグ木で殴る。O(NlogN)

Problem - C - Codeforces

 

Ratedだったら+81だったらしいのでつらい…

Codeforces(MemSQL Start[c]UP 3.0 - Round 1)

5完122位でした!すごい!Round2も頑張るぞ!

A問題

本選に25人参加できるコンテストがあり、それらの参加者のうち何人かの予選での順位が与えられる。本選参加を辞退した人は最小で何人かな?

http://codeforces.com/contest/859/submission/30389464

 

B問題

ブロックがN個与えられるので、それらを並べてできる多角形の周の長さを短くしたい!

基本的には正方形を目指して並べる。欠けていても周の長さは変わらないが、一辺が1短い長方形を作れる場合があることに注意

http://codeforces.com/contest/859/submission/30389970

 

C問題

パイを順番に配っていく。お互いが最善を尽くしたときに得られるパイの大きさの総計を求める。まず先攻が配る権利を持っている。パイを自分に配ったとき、相手に配る権利が移る。

DP[次に何枚目のパイを配るか][また、配る権利を持っているのはどちらか]

でメモ化再帰を行った。

http://codeforces.com/contest/859/submission/30394617

 

D問題

トーナメントを行う。各参加者同士では勝率が定められている。i回戦で相手に勝った時、その勝利が発生する確率*2^(i-1)の点を得られる。また、相手が貯めこんでいる点も得られる。どのように進行したら優勝者の持つ点が最大になるかな?

まず各参加者についてi回勝ち残る確率を計算しておき、

DP[i回目に][jが勝ったときの]得点の最大値

を回す。

http://codeforces.com/contest/859/submission/30397238

 

E問題

席替えをする。各人について今の席と希望する席が与えられる。また、各人は席替え中に席を移動しない、若しくは希望した席に移動する。の二種類しか行動をとりえない。

まず、今の席から希望する席に向かって辺を伸ばし、有向グラフだと考える。

各連結成分についてループが存在しない場合、移動の仕方は連結成分の頂点数通り存在する。ループがある連結成分については、2通り存在する。

それらを掛け合わせてやればよい。

http://codeforces.com/contest/859/problem/E

 

レート変動は1910->2038でhighestを更新した。やったぜ。

TCO17 Pittsburgh Event / Fun SRM

EasyとMedが通って33位

1573->1565(悲しいね)

Easy 文字列sとtが与えられるので{0,o},{1,l},{m,n}の入れ替えだけでs->tにできるか判定する。

Med 数列が与えられるので、任意の3数の和が9の倍数にならない最大の組み合わせを求める。bitDPをしたがうしさんによると賢い解法があるらしい。

Hard 各深さについて余分に一個頂点作ってベルマンフォード回せばよさそう

CSAcademy#47

4完104位、悲しいね

A 舐めて求める数を数えます

B 何個数字使うかを全探索してうまくいくときに出力する。

C v[i]はnum[i][0]~num[i][W-1]のLCM、u[i]はnum[0][i]~num[H-1][i]のLCM

条件を満たしていたら出力

D 数がNの時は、N/2と(N+1)/2の結果から導き出せるので、再帰的に求める。

なお、必要なNは高々logNなので足りる

悲しいと思ってたらレート上がってよかった。(1781->1785)