DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord連携を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

ペペロパーティー

問題に戻る

解説

残った贈り手と受け手をそれぞれ番号順に並べ、同じ順位同士を対応させる。最初は自分自身との対応なので有効である。この対応が有効で、対応先の番号が贈り手の元の番号以下という不変条件を維持する。

贈り手iiiの対応先をxxx、その直前の残った受け手をyyyとする。直前がなければy=0y=0y=0とする。Li>yL_i>yLi​>yの人を詰まった贈り手と呼ぶ。先頭の贈り手は常に詰まっている。最も右の詰まった贈り手iiiを選ぶ。

応答jjjはj≥Li>yj\geq L_i>yj≥Li​>yなのでxxxより左にはない。iiとを除くと、その間の贈り手の対応先が受け手1人分ずつ左にずれる。の右に詰まった人はいないので、下限を満たし続ける。対応先は小さくなるので上限も保たれる。したがって、インタラクターのどの選択に対しても毎ターン成功する。

残った各贈り手について

Di=rank⁡giver(i)−#{残った受け手 j<Li}−1D_i=\operatorname{rank}_{\rm giver}(i)-\#\{\text{残った受け手 }j<L_i\}-1Di​=rankgiver​(i)−

を管理する。順位は1から数える。有効な対応ではDi≥0D_i\geq0Di​≥0であり、詰まった人はちょうどDi=0D_i=0Di​=0の人である。贈り手iと受け手を除くと、かつを満たす人のだけが1減る。の人は必ずの右にいるため、2つの順位の変化が相殺される。

元の贈り手の番号を大きさBBBのブロックに分ける。各ブロックをLiL_iLi​順に並べ、遅延セグメント木で接頭辞への減算と最小値を管理する。選択した人のブロックは遅延値を展開し、直接更新して再構築する。右側の完全なブロックはLk≤jL_k\leq jLk​≤jの接頭辞を1減らす。最小値0のブロック集合から最も右の0を探せる。

時間計算量はO(N(B+(N/B)log⁡B))O(N(B+(N/B)\log B))O(N(B+(N/B)logB))、空間計算量はO(N)O(N)O(N)であり、実装ではB=1024B=1024とする。では順序対応を配列で直接管理する解法でよい。では贈り手と受け手の使用状況を2つのビットマスクで表し、すべての応答を調べる完全探索で解ける。

Solution written by GPT6.1

i
jjj
iii
LLL
RRR
#{残った受け手 j<
Li​}−
1
i
i
jjj
k>ik>ik>i
Lk≤jL_k\leq jLk​≤j
DkD_kDk​
Lk>jL_k>jLk​>j
iii
B
=
1024
N≤2000N\leq2000N≤2000
O(N2)O(N^2)O(N2)
N≤8N\leq8N≤8