备忘录

Multi-brydż

这啥题。/tuu

容易想到从值域入手。

然后我们不妨钦定拥有最大分数的为 \(A\) 否则为 \(B\)

然后考虑每次出现的情况:

  • 循环 \(i\)。如果 \(i\) 为奇数,称“本该属于 \(A\)”,否则称“本该属于 \(B\)”。
  • 如果“本该属于 \(A\)” 的给 \(B\),称 \(B\) 占优,否则称 \(A\) 占优。
  • 如果出现两者之一占优,则“未确定部分”全部赋值为一个值。
  • 环中出现第 \(i\) 大的数。
  • 环中所有不是先走第 \(i\) 大再走第 \(i-1\) 大再走第 \(i-2\) 大再...以此类推的出发点直接赋值,具体赋值情况是当前谁本属于谁确定的。

然后我们有关键定理:

  • 一个位置记录的 \(a_i\)(不妨认为算法师为 \(B\) 队,如果是 \(A\) 队类似)是从 \(i\) 位置逆时针往上走,先找到最大,再找到次大,以此类推,直到回到原点为止。记录的是找不到的那个第 \(i\) 大模 \(2\) 的结果。(前提是不出现某一队占优的情况)注意,最后再找自己。
  • 如果出现某一队占优,则必须未确定数都是一个值,且恰好符合占优情况。
  • 如果循环前 \(2n\) 大都找到了,则胜负取决于 \(2n+1\) 大属于哪一队。

我们为了计数的普适性,我们再增添一条规则:

  • 如果寻找过程中出现非一个奇数一个偶数交替情形,直接停下并赋值。

我们并提前钦定 \(2n+1\) 属于哪一队。

然后我们开始计数。 /tuu

从后往前扫,考虑每一次的变化:

  • \(0 \rarr 0\)。可能出现了一个 \(1\) 在当前位置,或者说没有变化,即出现了一个“小于”当前搜寻位的数。
  • \(0 \rarr 1\)。出现了一个等于当前搜寻位的数,但是可能违反位条件。
  • \(1 \rarr 1\)。出现了一个小于当前搜寻位的数。
  • \(1 \rarr 0\)。出现了一个等于当前搜寻位或者 \(1\)

考虑钦定 \(1\) 的位置。发现好处是 \(1\) 位置一旦确定每次变化时就一定是出现等于搜寻位,否则就是小于,更好的事情是 \(1\) 这一维记录的答案一定是 \(2\)(找不到 \(2\))所以考虑一直往后延伸,可以直接标记得到当前是 \(<?\) 或者 \(=?\)。已经确定的 \(=\) 是很好计数的,剩下的只有小于约束那么可以随便填,容易计数,注意细节即可。

posted @ 2026-05-14 11:23  Onlog2n  阅读(15)  评论(0)    收藏  举报