ABC165参戦
ABC165に出れました。起きてたので出れました。
解説放送見ればよくね?そうだね なんで書いてるの?知らん
A - We Love Golf
- A問題の制約なら、A以上B以下の数全部試せばいいやろ 終わり
B - 1%
- そもそも最初問題の意味あんまり分かってなかった 日本語力の問題
- 愚直には、×1.01とfloorを取るのを繰り返せばいい
- 制約が1018なのが気になるけど...電卓で計算したらだから愚直で大丈夫
C - Many Requirements
- え、わからん(絶望)
- DPも思いつかないし、グラフ等に直せる気配もない
- 全部試すにしても、20C10ってくらいでしょ?(これ間違い)
- D行こ
D - Floor Function
- 1~Nまで試すのは当然ダメ
- 凸関数になってるとか、何かそういう都合のいい性質があるのかな?例2の設定でx=1~100まで出力してみる
- 結果どうも周期がありそうに見える、しかも周期がB -> 余りで変わるのか?
- とおくと、([]はfloor)
- じゃあqを0からB-1まで動かせばいいな(Nにより多少変わる)
- TLE&WAしました(Bの制約考えればそれはそう)
- さっきの式をもう一回眺めると つまりだけ見ればいい そしてこれは単調増加
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
みたいにちょっと値をずらさないといけない
- この値の切り替え点とかパターン構築とかがめちゃくちゃ時間かかった
F - LIS on Tree
- とりあえずわかりやすいように頂点0を根にしておく
"一直線の"数列のLISの求め方は
- 昇順で調べる
- 各に対し、max{自分より前の位置でLISをすでに求めた項のLIS}+1を自分のLISとする
(蟻本に載ってる実家DPよりこっちの方が個人的に好き)
これを根~任意頂点間の最短パス上の数列LISにしようとしたら、
- 昇順で調べる
各に対し、max{自分から根のパス上の、自分より根に近い頂点の最大LIS}+1を自分のLISとする
この前書いたHLDで終わりやんけ!(当然皆さん私のHLDの記事は読みましたね?(傲慢))
狭義単調増加なので、同じを持つ頂点については、根から遠いものから見る(各頂点の深さは別にbfsで求めた)
「う~んこれは勝ちでしょ!やっぱりHLDは偉大だn」
AtCoderさん「WAです^^」
- 全く原因がわからないし残り20分だったのでCに戻る
C - Many Requirements(再)
- やっぱりうまい方法が見つからないけど、全探索....?あっ冷静に電卓したら1010もありませんね
- 全パターン作って(105通りぐらいだった)、各数列についてMパターン確かめれば終わり
全パターン作るには、
- 長さNの配列V = {1,1,...,1}を用意
- 以下をwhile(true):
- 今のVの状態での和を計算
- Vの、でない一番後ろの要素の位置をとする
- を1増やし、をでそろえる
- (10進数の増え方を考えればまあ たまにやる処理のちょっと変形版みたいな)
ここで終了
F - LIS on Tree(再)
- 上の手順で求められるのは、厳密には各頂点LISではなく「各頂点のが末尾に来る数列のLIS(☆)」
本当に答えとなるLISを求めるには各頂点について、根までのパス上の頂点の(☆)を順に見ていって最大値を取らないといけない
〆
ひどいミスり方してしまって笑えん 道具が優秀でも使い手が下手ならうまく活かせない典型
明日取り帰すぞ~~
もう今日だった