文章目录

‹
›

P17723 [SCP-S 2026] 函数 / func 题解

P17723 [SCP-S 2026] 函数 / func 题解

思路

答案要求的是所有区间价值之和。由于 \(f(l,r)=\text{OR}(S)\lor \text{MEX}(S)\) 是按位或,可以逐位计算贡献:对每一个二进制位 \(b\),统计有多少个区间的 \(f\) 值在第 \(b\) 位为 \(1\),设个数为 \(c_b\),则

\(Ans=\sum_{b=0}^{29}c_b\cdot 2^b\)

区间总数记为 \(T=n (n+1) / 2\)。直接统计「第 \(b\) 位为 \(1\)」不方便,反过来统计「第 \(b\) 位为 \(0\)」的区间数 \(z_b\),则 \(c_b=T-z_b\)。

关键转化

先注意一个事实:任意区间的 \(\text{MEX}\) 不会超过区间长度,因此

\(\text{MEX}(S)\le n\le 2\times 10^6<2^{21}\)

所以当 \(b\ge 21\) 时,\(\text{MEX}\) 的第 \(b\) 位恒为 \(0\),这一位只受 \(\text{OR}\) 影响。

固定一个二进制位 \(b\),记 \(P=2^b\)。区间价值的第 \(b\) 位为 \(0\),等价于 \(\text{OR}\) 的第 \(b\) 位为 \(0\) 且 \(\text{MEX}\) 的第 \(b\) 位为 \(0\)。

  • \(\text{OR}\) 第 \(b\) 位为 \(0\),意味着区间内每个数的第 \(b\) 位都是 \(0\),即区间全部落在由「第 \(b\) 位为 \(0\) 的位置」组成的某个连续段内。
  • 在这个前提之下考察 \(\text{MEX}\),记 \(m=\text{MEX}(S)\):
    • 若 \(0,1,\ldots,P-1\) 全部在区间中出现过,则 \(m\ge P\)。而区间 \([P,2P)\) 内的数第 \(b\) 位都是 \(1\),不可能出现在区间中,所以不可能有 \(m\ge 2P\),故 \(P\le m<2P\),此时 \(m\) 的第 \(b\) 位为 \(1\),价值的第 \(b\) 位为 \(1\)。
    • 若 \(0,1,\ldots,P-1\) 中存在某个 \(v\) 没有出现,则 \(m\le v<P\),此时 \(m\) 的第 \(b\) 位为 \(0\),价值的第 \(b\) 位为 \(0\)。

于是得到核心结论:

第 \(b\) 位为 \(0\) 的区间 = 完全处在「第 \(b\) 位为 \(0\) 的连续段」中的区间,减去其中同时包含了 \(0,1,\ldots,P-1\) 全部这 \(P\) 种值的区间。

详细证明
  • 固定一位 \(b\),记 \(P=2^b\)。一个区间 \([l,r]\) 的 \(f(l,r)\) 在第 \(b\) 位为 \(0\),当且仅当

\((\text{OR 的第 }b\text{ 位}=0)\ \text{且}\ (\text{MEX 的第 }b\text{ 位}=0)\)

  • 因为按位或的某位为 \(0\) 当且仅当所有参与运算的数该位都为 \(0\)。所以上式第一项要求区间里每个 \(a_i\) 的第 \(b\) 位都是 \(0\),也就是说这个区间必须完全落在「第 \(b\) 位为 \(0\) 的位置」所形成的某个连续段里。

  • 于是我们先统计所有这样的区间:把每个连续段的长度 \(len\) 取出来,它贡献 \(len(len+1)/2\) 个区间。这是等式右边的前半部分。

  • 接下来,在这些区间中,有些虽然满足 \(\text{OR}\) 该位为 \(0\),但 \(\text{MEX}\) 的该位为 \(1\),所以它们实际上不是「第 \(b\) 位为 \(0\) 的区间」,需要把它们减掉。

  • 现在看第二项:在「所有数第 \(b\) 位都为 \(0\)」这个前提下,\(\text{MEX}\) 的第 \(b\) 位什么时候为 \(1\)?

    • 注意 \(P,P+1,\ldots,2P-1\) 这些数的第 \(b\) 位都是 \(1\)。因此它们不可能出现在区间里。

    • 如果 \(0,1,\ldots,P-1\) 这 \(P\) 个值在区间中全部出现,那么 \(\text{MEX}\ge P\)。可是 \(\text{MEX}\) 又不能 \(\ge 2P\),因为那需要 \(P,P+1,\ldots,2P-1\) 全部出现,和上面矛盾。所以此时 \(P\le \text{MEX}<2P\),它的第 \(b\) 位是 \(1\)。

    • 反过来,如果 \(0,1,\ldots,P-1\) 中至少缺一个,那么 \(\text{MEX}<P\),它的第 \(b\) 位就是 \(0\)。

  • 所以,在「所有数第 \(b\) 位为 \(0\)」的区间中,恰好是那些「同时包含 \(0,1,\ldots,P-1\)」的区间会让 \(\text{MEX}\) 的第 \(b\) 位变成 \(1\),从而需要被删除。

  • 最终得到:

\(\text{第 }b\text{ 位为 }0\text{ 的区间数}=\text{完全处在第 }b\text{ 位为 }0\text{ 的连续段中的区间数}-\text{其中同时包含 }0\sim P-1\text{ 的区间数}\)

两类区间的计数

  • 第一类很简单:把第 \(b\) 位为 \(0\) 的位置划分成若干连续段,长度为 \(len\) 的段贡献 \(len * (len+1) / 2\) 个区间。
  • 第二类在每个连续段内部用双指针统计即可。

对 \(2^{64}\) 取模直接使用 unsigned long long 的自然溢出。

复杂度

  • 时间复杂度:\(O(30n)\)。

posted @ 2026-10-22 16:23  lvwangshu  阅读(38)  评论(0)    收藏  举报