はまやんはまやんはまやん

hamayanhamayan's blog

Google Code Jam 2017 Round 1A 問題と解説

https://code.google.com/codejam/contest/5304486/dashboard

A. Alphabet Cake

R*Cのマスがある。
各マスは?かA~Zで塗られている。
A~Zは最多"1つ"だけ書かれている。
残りの?のマスを全ての文字の領域が長方形になるようにA~Zを塗れ。

B. Ratatouille

(キレた)

C. Play the Dragon

自分の体力Hd攻撃力Ad, 敵の体力Hk攻撃力Akである。
自分が先攻で以下の行動ができる。

1. 攻撃 : 攻撃力分だけ相手の体力を減らす
2. バフ : 攻撃力を+Bする
3. 回復 : 体力をHdにする
4. デバグ : 相手の攻撃力を-Dする

最短何ターンで勝てるか。勝てないならIMPOSSIBLE

以下、解説

続きを読む

競技プログラミングにおける平方分割問題まとめ

平方分割

  • Square Root Decomposition
  • 区間に対するクエリに対して高速に処理できる
  • ここが詳しい
  • 区間でのクエリであるが、ソートして平方分割して、各バケットでクエリに入る要素だけ抜き出す平方分割もある
    • こういう問題
    • 1.添字と共に昇順ソート 2.バケット毎に添え字ソート 3.各クエリについて全てのバケットのans[L][R]を取得してマージ
    • 出現頻度を扱う場合は平方分割が多いイメージ
  • クエリの平方分割
    • Q個のクエリを分けて解く手法 資料
  • 取得クエリだけで更新クエリが無い場合はバケットの間の処理は事前計算することで、処理をより軽くすることができる場合がある この解説

競技プログラミングにおけるHL分解まとめ

HL分解

問題

競技プログラミングにおけるオイラーツアー問題まとめ

オイラーツアー

  • 木をDFSしたときの順番で頂点を記録する手法
    • pre-order : 頂点に到着したら記録
    • post-order : 頂点から離れるときに記録
  • 用途
    • 根付き木のある頂点からの部分木に対するクエリを処理
    • ある頂点がある頂点の部分木に含まれるかを高速に判定する
    • 上手くオイラーツアーを作るとパスのコストの総和が取れる
  • 木をBFSしたときの順番で頂点を記録するBFS Euler Tourというのもある
    • オイラーツアーのbfs-order
    • 用途としては、ある頂点から一定の距離にある頂点に対して区間操作を行える

問題

オイラーツアーっぽくやる問題

Google Code Jam Qualification Round 2017 問題と解説

https://code.google.com/codejam/contest/3264486/dashboard

問題

A. Oversized Pancake Flipper

+と-から成る文字列Sがある。
連続する丁度K個の文字をひっくり返して全て+にする。
最小何回ひっくり返すと全て+になるか。
不可能ならIMPOSSIBLE

B. Tidy Numbers

N以下で最大のtidyな数を答えよ。
tidyな数 : 各桁毎で見ると狭義単調増加列である数

C. Bathroom Stalls

x=0, x=N+1に仕切りがしてある。
以下のルールでK個の仕切りを追加する。

  • 左右の仕切りへの距離Ls,Rsのmin(Ls,Rs)が最大となるx座標に置く
  • 複数個候補があるならば、その中でmax(Ls,Rs)が最大となるx座標に置く
  • それでも、複数個候補がある場合は最も左に置く

K個目の仕切りを置いた時の、左右の距離の最大と最小を答えよ。

D. Fashion Show

N*NのグリッドにM個の'+','x','o'が置いてある。
'+'と'x'は1ポイント、'o'は2ポイント入る。
ポイントを最大化するが、以下のルールを守る必要がある。

  • 左右上下の任意の二組のうち、どちらか1つが'+'
  • 対角線上の任意の二組のうち、どちらか1つが'x'

以下の操作を行ってルールを守りつつポイントを最大化せよ。

  • '+'と'x'を'o'にする
  • 空の所に任意の記号を追加する


以下、解説

続きを読む

HourRank 19 問題と解説

https://www.hackerrank.com/contests/hourrank-19/challenges
問題から

Recover the Arrays

N個の配列が与えられる。
これを先頭から「e a[0] a[1] ... a[e-1]」のルールで改行する。
何行になるか。

What Are the Odds?

N個の石の山に対してNimをする。
ゲームの前にAliceは[b,e]の範囲の石を全て取り去り、Bobが先手でNimが始まる。
AliceがNimで勝てる[b,e]の範囲は何通り?

Maximal Tree Diameter

N頂点の木がある。
以下の操作を1回だけ行うことで木の直径を最大化する。

  • 辺を1つだけ削除
  • 辺を1つだけ再び木に戻るよう追加

直径の最大値は?
※ 木の直径 : 木の中の最長距離



以下、解説

続きを読む