ARC173

3完。ありがとう。

A - Neq Number

Neqの意味がわからなかったけど、not equalか。Bも読んで難しそうなのでやっぱりAをやって、わからないので愚直に桁DP(N以下のNeq Numberの個数がわかれば二分探索できる)。N=1234のとき12を0012と解釈して0が連続してるからとはじいてしまうのを避けたい。1桁の個数と2桁の個数と3桁の個数と4桁でN以下の個数を足すことにする。下から1桁目は前の桁の影響を受けないので場合分けして処理。この辺り色々試して添え字ガチャみたいになってた。最上位桁の1から9を足して0は答えに足さないというのがポイントだった。46分でAC。ARCをまともに戦えるギリギリの時間という感じ。

(追記)N桁のNeq Numberは9^N個(最上位から1桁ずつ決めていくと毎回9通り)。よって、9の冪を引いていくことで桁数がわかり、その桁数内で何番目を求めればいいかがわかる。そしたら上の桁から9通りの何番目かで決めていく。9進法と対応付けるのはここ。0以上9^N未満の整数を9進法で表したものが、N桁のNeq Numberと対応している。0から9の中で前の桁(最上位桁の前の桁は0とする)と異なるものから選ぶ。

B - Make Many Triangles

3点が一直線上にあるかは、点のどれかを基準に2つのベクトルを作って外積が0かで判定できる。全探索もできる制約。NGの組み合わせが与えられるので3人組をいくつ作れるかという問題と思ったが、これは全然わからない。もっと問題固有の性質を使う。直線にたくさん乗ってるとき、直線上の2点と他の1点で三角形が作れる。1個余ったときが不安だが、さすがになんとかなりそう。最大で一直線上に何個あるかが重要そうなのでそれを調べるコードを書きたい。よく考えたら3重ループで愚直にできた(なんか工夫なしでは3乗超えそうなイメージ持ってたけど違った)。書いていくとめっちゃ単純な答えになったが、提出してAC。提出後C問題に行ってから少し考えて、一直線上にある最大個数が全体の2/3以下を保ったまま取り除いていけそうだなとか思ってた。解説見ると証明は思ったより大変そう。

山登りが正当性あるのなるほどなあ。最初、山登り落とすケース作ってなかったのかなとか思ってたけど、落とせないんだ。

C - Not Median

中央値ではないとか、解けるわけがない見た目。ちゃんと考える。自分より大きいのと小さいのの個数が同じだとダメ。同じになるのはどういうときか考えると、自分をO、大きいのをH、小さいのをLとして、HLHLOHLHLのようになっているとどうやっても同じになる。このパターンが崩れるところを探せば条件を満たす区間が作れる。左右の長さが違うときを考えると、一番端以外はまあ普通にできて、端のときはOLHHLでも同じになってしまう。さて、さっきのパターンを見ると、LOHのところは単調増加になっている、つまり隣のやつ視点だとLH交互にはならない、答えが小さくなる。これは愚直にやって間に合うやつではと思い(全然証明とかわからないけどそれに賭けるしかないような状況なので)、両端だけ場合分けして愚直を書く。左右でLH逆になるの書き忘れてサンプル合わなかったりしてたけど、サンプルが通ったら提出してAC(WAは出ない予定で、TLEが心配だった)。通って、「ありがとう」と言っていた。何も証明してないのに結果だけをもたらしてくれてありがとう。ペナが多いのは順位表で知っていたし、ただ運が良かった。

D - Bracket Walk

全くわからなかったが、解説放送聞いてなるほどなあすげえなあとなった。Eもなんとなく聞いてたけど、ARCの高難度はしっかり難しいんだよな。

(追記)'('を1、')'を-1とする。ウォークの各位置での累積和が常に0以上で始点(は当然0だが)と終点が0であればよい。始点と終点が同じなので、全体の和が0でありさえすれば、和が最小のところを始点とすれば括弧列になる。言われてみればそう。じゃあ和が0の条件を満たすウォークがあるか。負閉路と正閉路(って言うのか?)が両方ある場合、括弧列以外の条件を満たす適当なウォークをとって和が負だったら正閉路を何回かくっつけて和を正にして、次に負閉路をとって互いの和の絶対値のぶんだけ周れば0になる、つまりYes。どちらもない場合、括弧列以外の条件を満たす適当なウォークをとれば0になってるからYes。片方だけある場合、対称性から負閉路だけある場合だけ考える。負閉路をとって、括弧列以外の条件を満たす適当なウォークからその負閉路で使った辺を取り除く(全ての辺を使ったウォークだからできる)。取り除く前も後も、全ての頂点について入次数と出次数は等しい。よって、取り除いた後のグラフについて、次数が正である頂点があるかぎりそこから出発して(行き止まりになることはないので)初めて同じ頂点を訪れたところで(その頂点を初めて訪れるまでの経路も)切って閉路を得ることができ、結局最初のウォークはいくつかの閉路に分解できる。これらの中に正閉路は存在せず、負閉路は存在しているので、ウォークの和は負であるとわかる。どんなとり方をしてもそうなので、No。いやー解説の行間を埋めるのにめちゃくちゃ時間かかった。全ての辺を使うという条件を使い切るのが難しかった。