AtCoder Grand Contest 046
※解説的なものを期待している場合、以下は全く読む価値ないです。
ほとんどどのようなことを考えてハマっていたかだけが書かれています。
コンテスト前のレート:1801
レート通りのパフォーマンスが得られる順位:571位
A - Takahashikun, The Strider
問題
勘で投げて賭けに勝った。
思考過程
- 例を見た雰囲気で、がの倍数になれば原点に戻ってこれそうだと思う。
- 例2はほぼ円(正360角形)の軌道になりそうな気がするし、多分大丈夫? 証明は知らん。
- 余計なオーバーフローの確率を減らすため、平気なはずだが念のためlongにしておく。
後から、軌道を繋げていくのではなく、全部原点を始点としたベクトルにしてみるとスター型のグラフのようになり、本のベクトルの和がゼロベクトルとなる状態を思い浮かべると、なんとなく合ってそうと思えた。
import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); long x = sc.nextInt(); sc.close(); for (int i = 1; ; i++) { if (x * i % 360 == 0) { System.out.println(i); return; } } } }
ここまで2分22秒+0ペナ。248位。
B - Extension
問題
50分ほどかけて解けず。
思考過程
- 例2を元に考えてみる。
- 黒く塗れる可能性のあるマスは、マス。行追加と列追加は合計回なので黒マスは個。
- から余事象を引くとかできるか? →重複排除するのが非常に難しそう。
- 下から行目を追加したときの黒の位置が何列目かで場合分けすると以下のようになり、全部足すと通りで合ってる。
- 列目:通り
- 列目:通り
- 列目:通り
- 列目:通り
- 例2に行追加し、「2 1 4 4」だったらどうなるか?
- DPをしたときの行目から行目への遷移を考えるが、行目と行目の黒マスの位置関係パターンを全部個別に求めて加算する必要がありそうで、上記の式のをに変えたりする必要もありそうな?
といったところでだいぶ時間も過ぎたのでC問題へ。
C - Shift
問題
初手でB問題よりいい感じに考察進んだ気がしたし、こちらの方が点数が高いので、残り時間を全部つぎ込んだが解けず。
思考過程
- 無限回操作できるとすると、最終的には「111...000...」のような並びになる。
- '1' を '0' の前に移動させる操作は、上記の最終形をソート済み状態と見たときの転倒数を減らす操作のように見える。
- 各 '1' について、前方に '0' がいくつあるかの数列を作ると、その数列と文字列の並びは対で対応する。例1~3を数列に変換すると以下のようになる。
- 0101 → [1, 2]
- 01100110 → [1, 1, 3, 3]
- 1101010010101101110 → [0, 0, 1, 2, 4, 5, 6, 6, 7, 7, 7, ]
- このような数列に対し、番目の要素を以上減らす操作を回以下行って作れる数列は何通りか?(※操作後にソートして同一になるものは通りとみなす) という問題に言い換えられた。
- 「:番目まで見て、操作を回行って、ソート後数列の末尾の値が」というものを考えてみたが、結局遷移を上手く書き切れずに終了。
解説PDFを見るとDPの定義が完全に違いそう。
やっぱりDPは苦手分野っぽい。
最終結果:Aの1完、980位、パフォーマンス1381
レート変動:1801→1765
水色時代はAGCに稼がせてもらっていたのに、最近のAGCの成績はいまいち。
むしろ5月6月は完全に失敗しているのはAGCだけなのだが・・。