結果
順位 514th / 2032 パフォーマンス 1663 レーティング 1916 → 1893(-23)
ペナルティが重たくのしかかる。再びmerom氏にレート抜き返されてしまった。
A - 01 Matrix
さっぱりわからなくてやばかった。58分かけて8WAの後に通すことができたけどこれは致命傷。
最終的には
- 行のうち、0が個である行が行、個である行が行とする。同じように列に関しても0が個となる列が列としてを全探索する
- 行の数式から考えて1を立てる数と、列の数式から考えて1を立てる数が一致するを見つける。
- 各列が必要とする1の数を
std::priority_queue
に詰めていく - 各行が必要とする1の数だけ上で作った
priority_queue
から取り出していき、そこへ1を書き込んで(各列が必要とする1の数を一つ減らして)priority_queue
に詰め直す
というやり方で解いた。3以降でこういうことをやらずに左上から貪欲に詰めていくと
5 5 2 2
でダメになりWAを連発したので七面倒臭いことをやらなければいけなかった。
解説PDFを見て、これはどう思いつけば良いのかさっぱりわからない。あまりにもきついA問題だった。
B - Sorting a Segment
これは見てすぐ端の関係だけ考えれば良さそうという感じでセグメント木を二つ持って、あとはソートしてもなにも起きない場合を考えて無理やり通した。A問題よりよっぽど簡単。
C - LCMs
コンテスト中はさっぱりわからなかった。解説を見て、頭が良すぎる! という印象。しかし値の上限が小さめであることには気づいて良かったな。普通に考えて解けるわけない問題なんだからそういうところに目が行かないのはちょっと感覚が悪かった。
解説の内容をコードに翻訳するような形で通したけど、約数列挙をでやると余裕でTLEだし、強い人たちの会話
約数側から処理すると良いです
— 熨斗袋 (@noshi91) 2019年9月21日
つまり、2 の倍数全部に 2 を push して、3 の…とやっていきます (調和級数)
を見て「なるほどstd::vector
に突っ込んで行けばよいのか」と思ってやったらそれもTLEだし、直接を構築しているときに上手いことやるということが必要だった。こういうの本番中に解ける気がしない。