DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 账号绑定的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

百奇派对

返回题目

题解

将剩余赠送者和接收者分别按编号排序,并匹配相同排名的人。初始时每个人与自己匹配,因此合法。维护匹配始终合法,且每个匹配接收者的编号不超过赠送者原来的编号。

对赠送者iii,设匹配接收者为xxx,前一个剩余接收者为yyy,若不存在则令y=0y=0y=0。若Li>yL_i>yLi​>y,称iii为受阻赠送者。第一个赠送者始终受阻。选择最右边的受阻赠送者iii。

回复jjj满足j≥Li>yj\geq L_i>yj≥Li​>y,所以不会在xxx左边。删除ii和后,它们之间的赠送者的匹配各向左移动一个接收者。右边没有受阻赠送者,因此移动后仍满足下界。接收者编号变小,也保持满足上界。匹配继续合法,从而对于交互器的任何选择,每轮都能成功。

为每个剩余赠送者维护

Di=rank⁡giver(i)−#{剩余接收者 j<Li}−1,D_i=\operatorname{rank}_{\rm giver}(i)-\#\{\text{剩余接收者 }j<L_i\}-1,Di​=rankgiver​(i)

排名从1开始。合法匹配保证Di≥0D_i\geq0Di​≥0,受阻赠送者恰好满足Di=0D_i=0Di​=0。删除赠送者ii与接收者后,恰好将且的赠送者的减1。因为的赠送者必然在右边,两个排名变化相互抵消。

按赠送者原始编号分为大小为BBB的块。每块按LiL_iLi​排序,用懒标记线段树维护前缀减1和最小值。对选中赠送者所在的块,下放懒标记、直接更新并重建。对其右边的完整块,更新满足Lk≤jL_k\leq jLk​≤j的前缀。维护最小值为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。当时,可直接用数组维护有序匹配,得到算法。当时,可用两个使用状态位掩码,枚举交互器所有回复进行极小极大搜索。

Solution written by GPT6.1

i
jjj
iii
LLL
RRR
−
#{剩余接收者 j<
Li​}−
1,
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