ABC165参戦

ABC165に出れました。起きてたので出れました。
解説放送見ればよくね?そうだね なんで書いてるの?知らん

A - We Love Golf

  • A問題の制約なら、A以上B以下の数全部試せばいいやろ 終わり

atcoder.jp

B - 1%

  • そもそも最初問題の意味あんまり分かってなかった 日本語力の問題
  • 愚直には、×1.01とfloorを取るのを繰り返せばいい
  • 制約が1018なのが気になるけど...電卓で計算したら\displaystyle{\mathrm{log} _ {1.01}(10^ {16}) \lt 2000}だから愚直で大丈夫

atcoder.jp

C - Many Requirements

  • え、わからん(絶望)
  • DPも思いつかないし、グラフ等に直せる気配もない
  • 全部試すにしても、20C10って\displaystyle{\underline{10^ {10}}}くらいでしょ?(これ間違い)
  • D行こ

D - Floor Function

  • 1~Nまで試すのは当然ダメ
  • 凸関数になってるとか、何かそういう都合のいい性質があるのかな?例2の設定でx=1~100まで出力してみる
  • 結果どうも周期がありそうに見える、しかも周期がB -> 余りで変わるのか?
  • \displaystyle{x = Bp+q(0\leq q \lt B)}とおくと、([]はfloor)
\displaystyle{
\begin{align*}
\left[\frac{Ax}{B}\right]-A\left[\frac{x}{B}\right] &= \left[\frac{ABp+Aq}{B}\right]-A\left[\frac{Bp+q}{B}\right] \\
&= Ap+\left[\frac{Aq}{B}\right]-Ap-A\left[\frac{q}{B}\right]\\
&= \left[\frac{Aq}{B}\right]-A\left[\frac{q}{B}\right]
\end{align*}
}
  • じゃあqを0からB-1まで動かせばいいな(Nにより多少変わる)
  • TLE&WAしました(Bの制約考えればそれはそう)
  • さっきの式をもう一回眺めると\displaystyle{[q/ B] = 0} つまり\displaystyle{[Aq/B]}だけ見ればいい そしてこれは単調増加

atcoder.jp

E - Rotation Matching

  • とりあえずおんなじ人が番号コロコロ変えると面倒
  • 番号変えるっていうルールをなくすと、
    • a vs b
    • a-1 vs b-1
    • a-2 vs b-2
    • ...
    • a-M+1 vs b-M+1 みたいな当たり方をすることになる(<=0,>Nはよしなに考える)
  • つまり何回目の試合だとしても「2人の対戦者の番号の差」は会場ごとに一定 なのでM個の会場で差がダブらないようにすればいい?
  • 例えば例2なら

    • 会場1:差1 (または6)
    • 会場2:差2 (または5)
    • 会場3:差3 (または4)
  • にしようとしたら、

    • 会場1:1 7
    • 会場2:2 6
    • 会場3:3 5

とかでもよさそう

  • 奇数の時はこんな感じでうまくいくけど、偶数の時が面倒

  • 例えばN = 10のとき、

    • 1 10
    • 2 9
    • 3 8
    • 4 7

とすると、差が3のペアが2つできる(2 9と4 7)

  • この場合は
    • 1 10
    • 2 9
    • 3 7
    • 4 6

みたいにちょっと値をずらさないといけない

  • この値の切り替え点とかパターン構築とかがめちゃくちゃ時間かかった

atcoder.jp

F - LIS on Tree

  • とりあえずわかりやすいように頂点0を根にしておく
  • "一直線の"数列のLISの求め方は

    • \displaystyle{A _ i}昇順で調べる
    • \displaystyle{A _ i}に対し、max{自分より前の位置でLISをすでに求めた項のLIS}+1を自分のLISとする

(蟻本に載ってる実家DPよりこっちの方が個人的に好き)

これを根~任意頂点\displaystyle{v}間の最短パス上の数列LISにしようとしたら、

  • \displaystyle{A _ i}昇順で調べる
  • \displaystyle{A _ i}に対し、max{自分から根のパス上の、自分より根に近い頂点の最大LIS}+1を自分のLISとする

  • この前書いたHLDで終わりやんけ!(当然皆さん私のHLDの記事は読みましたね?(傲慢))

  • 狭義単調増加なので、同じ\displaystyle{A _ i}を持つ頂点については、根から遠いものから見る(各頂点の深さは別にbfsで求めた)

  • 「う~んこれは勝ちでしょ!やっぱりHLDは偉大だn」
    AtCoderさん「WAです^^」

atcoder.jp

  • 全く原因がわからないし残り20分だったのでCに戻る

C - Many Requirements(再)

  • やっぱりうまい方法が見つからないけど、全探索....?あっ冷静に電卓したら1010もありませんね
  • 全パターン作って(105通りぐらいだった)、各数列についてMパターン確かめれば終わり
  • 全パターン作るには、

    • 長さNの配列V = {1,1,...,1}を用意
    • 以下をwhile(true):
      • 今のVの状態でd _ iの和を計算
      • Vの、Mでない一番後ろの要素の位置をnとする
      • \displaystyle{V _ {n}}を1増やし、\displaystyle{V _ {n+1},\cdots,V _ {N-1}}\displaystyle{V _ {n}}でそろえる
      • (10進数の増え方を考えればまあ たまにやる処理のちょっと変形版みたいな)

atcoder.jp

ここで終了

F - LIS on Tree(再)

  • 上の手順で求められるのは、厳密には各頂点LISではなく「各頂点の\displaystyle{A _ i}が末尾に来る数列のLIS(☆)」
    本当に答えとなるLISを求めるには各頂点について、根までのパス上の頂点の(☆)を順に見ていって最大値を取らないといけない

atcoder.jp

ひどいミスり方してしまって笑えん 道具が優秀でも使い手が下手ならうまく活かせない典型
明日取り帰すぞ~~

もう今日だった