2022年12月11日日曜日

yukicoder contest 369

 Bまで二完。


No.2132 1 or X Game

 解説AC。

 二連続で「-X」を行えないというルールのため、愚直を書くのが面倒くさい。かといって、自力で周期を導出するのはなかなか大変。
 また、周期が分かっても意外と実装しにくく答えを合わせるのが大変。

 だから、難問とは言えないかもしれないけど、ACしにくい問題に思えるのだけど……。

No.2134 σ-algebra over Finite Set

 解説AC。

 集合の「かつ」「または」「補集合」という演算について閉じているので、それらに関して独立な要素の個数を数えて、その2ベキが答えになることは分かった。
 が、要素の個数の求め方で迷走してしまった。(xorの掃き出し法とか使えるのかと)

 実際は、各要素について、それを含むような最小の集合を求めれば良い。それらの個数を数えればOK。
 言われてみれば難しくないけど、線形独立性と混乱したのが敗因。

2022年12月10日土曜日

AtCoder Beginner Contest 281

 Fまで六完。

コンテスト後のツイート

G - Farthest City

 解説AC。

 頂点1に距離が近い頂点から決めていくDP。

・DP[rest][last]で、決めていない頂点がrest個で、最後に決めた(今までに決めた中で距離が最も長いもの)の頂点の個数がlast個であるようなものの個数

 とすると遷移が求められる。

 そういうDPだと言われれば解けるけど、コンテスト中は何をすれば良いか分からなかった。

 制約からDPを疑うのは自然で、DPしようと思うなら、1から近い距離の頂点から決めようと思うのは自然。そう考えれば、自然な解法のはずなのだが。

yukicoder contest 371 (Asakatsu Presents)

 Dまで四完。


No.2157 崖

 自力ACだけど時間がかかった。

 普通に考えると三乗のDPになるけれど、それをどうやって高速化するか、という問題。

 まず、各D[i]をソートしておき、

・DP[i][j]=D[i][j]を使うときの、最小のfの値

 としたとき、

・DP[i][j]のままいけるのは、D[i+1]の値が、D[i][j]以上D[i][j]+DP[i][j]以下のとき
・それ以降は、D[i]の差に従って増えていく

 なので、前者を(双対)セグ木を使って更新。後者は別の配列を用意して求めた。


 実装大変だった割にたくさん解かれているなぁ、と思ったら、答えで二分探索すれば実装が楽だった模様。答えで二分探索は最初考えたけれど、なぜかできない気がしてやめてしまった。

AtCoder Grand Contest 059

 B一完でした。

コンテスト後のツイート

A - My Last ABC Problem

 (ツイッターで検索した範囲では)他に誰もしていない誤考察をしていた。「二色の連続部分列があれば、その二色のうちどちらか一色へ一手で変えられる」という。はっきり間違いですね。
 これに基づいた愚直解法を書いていたので、合うわけがない。

 愚直を書くときは、変な考察を交えず、本当に愚直になっているか確かめるべき、というのが教訓かなぁ。しかし、実際のところは、初手でこういう勘違いをしてしまうと、コンテスト中に気付くのは難しい気もする。

 正しい解法は、色が切り替わる箇所を二つずつ減らせる、というもの。端点についての考察は必要だけど、直感だけでいったら初手これを考えるだろう(解けなかった人でもこれを考えた人は多いはず)、というものでした。

2022年12月6日火曜日

yukicoder contest 368

 A一完でした。


No.2125 Inverse Sum

 解説AC。

 整数問題なので因数分解して右辺を定数(今回なら、N, Mを含まないP, Qのみの式)にしたくなる気持ちは分かる。
 因数分解の難易度が結構高い気がするけど、大学受験数学で十分出題されうるものか。

No.2126 MEX Game

 これは自力AC。

 後手は、Aにxが一個だけあり、MEXがxより大きいとき、それを別の数にすることで、MEXをそこまで減らせる。
 逆に、先手としては、0, 1, 2, ...がずっと複数個存在するような操作をすれば良い。

2022年12月2日金曜日

yukicoder contest 370

 Dまで。

コンテスト後のツイート

No.2144 MM

 解説AC。

 一個おきの階差が+1, -1されるんだなぁ、というところから考察が進まず。
 交代和、もしくは偶数項・奇数項の総和を考えれば良かったのですね。一項おきの何かに注目するという着眼はあったのだから、もっとそこを追及しなくてはいけなかった。

 その後の解説の方法は綺麗だけど思いつくのは難しそう。DPでも解けるらしいので、そちらの方が現実的か。

2022年12月1日木曜日

Codeforces Round #836 (Div. 2)

  遅刻してA一完。Bでハマってしまった。


B. XOR = Average

 nが奇数のときは[1]*nで良い。
 コンテスト中20分以上考えたが、nが偶数のときを思いつかなかった。最後の二要素で辻褄合わせをする……みたいな方針を考えたが上手くいかなかった。

 結論からいうと、[1,3]の後に[2]を続ければ良い。

 二要素で条件を満たすものがあれば、後にずっとその値を続ければ良いですね。言われてみれば当たり前。

E. Tick, Tock

 解説ツイートなどを見てAC。

・矛盾するかの判定→重み付きUnion-findで行、列ごとに管理
・答えを求める部分→A[i][j]が-1なら行iと列jをUnionして、連結成分数を見る。全体の連結成分が1よりいくつ大きいかを求めて、hをそのベキ乗したのが答え

 とした。

 矛盾するかの判定は自分で考えたこともあり、二度手間になっている気がするけどもっと楽にできるのかな? よく分かっていない。