CODEQUEEN2023-FINAL-OPEN

D以外の5完。気持ちのいいABCみたいなセットだった(Dだけは、あんなに解かれてるのが意味不明)。Fが通って、いい順位(昨日のつらさが吹き飛ぶ)。

A - QUEN

なんか読解に時間かかった。答え用のstringにpush_backしていく。cと等しいときはもういっかいpush_backする。

解説。ああ、出力していけばいいのか。

B - N-Queens Problem

テストケース作るの大変そうだなと思ってたら実際大変だったらしい。斜めを考慮しなくても置ける場所は唯一。そこに置いてみて、斜めを全探索。計算量が2乗にならなくて意外だった。クイーンがあるマスをsetに入れておいて判定したが、こうすると斜めにN-1回まで進んで盤外に出たかも判定する必要がない(判定を書いてから気づいた)。

ABCのABはこういうのがいい。Bは時間かかったけど、内容がある時間のかかり方だ。

C - Path Intersection

STのパス上の頂点なら、共通するのはその頂点しかない。で、Sを根として考えて、子のうち子孫にTがいないものの子孫たちと、Tの子孫と、あとSTのパスとそれ以外。けっこう場合分けが多いように見えて、図をよく見るとSTのパス上にある頂点とその子孫に分けることができる。まずDFSでSTのパスを求めて、そこに含まれる頂点に来たら深さカウントを0にリセットして、各頂点の深さを求める。1足して出力。

D - Moving Queen

やりたくないし、解ける気すらしない。ここでようやく、"QUEEN"に関連した出題が多いと気づく。Eへ。

他を通して戻ってきた。移動回数が3なので、移動方向を4^3通り全探索するとして、スタートから1回動いた場所とゴールから1回動いた場所を持って橋渡しする感じで、まあ解ける問題ではあるのだろうけど、場合分け地獄すぎてなあ。Eより解かれてるのは意味がわからない。俺がこういうの苦手すぎるだけなのか……。

E - Good Partition

左からある場所まで決めたときに、スコアさえわかっていれば分け方は関係ないので、DPできそうだと思う。しかし、あまりにもふわふわして2乗から落とせないのでさすがに少し考察を入れる。最大値と最小値は端にあるとしてよい。そうでないときはそうなるように端を切って別の区間にすることで損しないので。右端が最大値か最小値か2通りあるけど、累積maxでDPできるかも。左にj個の数がある場所で区切ったところから遷移することを考えて、左が最大値の場合はa[j]-a[i]、右が最大値の場合はa[i]-a[j]が加算される。a[i]がクソでかい場合でもa[j]-a[i]で考えて損した値しか出てこないので答えには影響せず、どっちが大きいかは考えなくていい。その場所で区切るときのスコアの最大値にa[i]を足し引きしたものでmaxを更新する。2系統あるだけで典型DPだった。実装も軽い。

F - Queen's Crown

問題設定の意図がつかめなかったが、サンプル2を見るとQueenのための冠を作るということか。角度を割り当てて面積をできるだけ大きくする問題。全部忘れてて最初余弦定理でググってた。そうじゃなくて外積だ。隣同士のRの積にsin(θ)で面積が求まる。あとは最大化するだけ。ちょっとずつ角度をやり取りしていく?Nが10万なので厳しそう。微分するとcosになって、最大化された状況ではこれが等しくなるはず。じゃあ等しく何になるかで二分探索できそうじゃん。角度の和が指定された値になるように。acosで角度を出すけど、値がちっちゃくなっても90度に近づくだけなので大丈夫、値がcos(π/(2*N))より大きくなったらπ/(2*N)にとどめる。ここの扱いが難しいけど、縮めという圧をかけられても硬いのでこれでいい(今考えると、ここで傾きが急激に大きくなる(角度を減らすと急激に面積が減る)という扱いにすればいいな)。つり合う場所が見つかったら、それぞれの角度を具体的に求めてsinで面積計算。サンプル合わないので、最後に引き忘れていた三角形を引いて、サンプルが合ったので提出してAC。