当前位置: 首页 > news >正文

如何使用 SG 函数解决 2026 JSCPC L

题目大意

AB 博弈,给定 \(n\) 个正整数,每次选择一个 \(x\) ,将该数字变成 \(x-1\) ,然后使所有大于 \(x\) 的数字变成 \(x\) ,无法操作者输。

题解

题目操作的本质是:选择一个值 \(x\),将其变为 \(x-1\),然后把所有大于 \(x\) 的数削平到 \(x\)

为了方便处理这种削平操作,我们将原数组降序排序,设为 \(h_1 \ge h_2 \ge \dots \ge h_n > 0\)

并定义差分数组 \(d_i = h_i - h_{i+1}\)(其中 \(h_{n+1} = 0\))。

当我们在原数组中选择了某个值 \(x\)(假设它对应降序数组中最后一次出现的位置是 \(k\),即 \(h_k = x\)\(d_k > 0\)),操作后的影响如下:

  • \(h_k \gets h_k - 1\)

  • \(h_1 \dots h_{k-1}\) 原本大于或等于 \(x\),全部被削平到 \(h_k\)

反映在差分数组 \(d\) 上:

  • \(d_k \gets d_k - 1\)
  • \(d_{k-1} \gets 1\)
  • \(d_1 \dots d_{k-2} \gets 0\)

观察上面的变化,你会发现一旦在 \(d_k\) 处进行操作,它会把 \(k-1\) 之前的所有状态强制覆盖。

这也就是说,操作 \(d_k\) 后得到的新状态,它的 SG 值完全且仅仅取决于 \(k\) 以及 \(k\) 后面的后缀 \((d_k, d_{k+1}, \dots)\)

这里你会发现每个操作的后缀的 SG 值是固定的,这点很糖,你只需要从后缀递推一个集合 \(S\),当前点的后继状态只有后缀集合和当前点权值 \(-1\)

定义:\(m_0 = \text{mex}(S)\)\(m_1 = \text{mex}(S \cup \{m_0\})\)\(m_2 = \text{mex}(S \cup \{m_0, m_1\})\)

设前缀仅第 \(j\) 位为 1 的状态 SG 值为 \(f_j\)

显然有 \(f_j = \text{mex}(\{f_{j-1}\} \cup S)\)

易得规律:\(f_0=m_0, f_1=m_1, f_2=m_0 \dots\)\(f_j = m_{j \bmod 2}\)

操作 \(d_k\) 会在 \(k-1\) 处产生一个 1,因此状态递推的底边界为 \(f_{k-1}\)

  • \(k\) 为奇数时:

    \(k-1\) 为偶数,底边界为 \(f_{k-1} = m_0\)

    SG 值在 \(m_0, m_1\) 间交替 \(\implies\) \(d_k\) 奇数为 \(m_0\),偶数为 \(m_1\)

  • \(k\) 为偶数时:

    \(k-1\) 为奇数,底边界为 \(f_{k-1} = m_1\)

    SG 值在 \(m_1, m_2\) 间交替 \(\implies\) \(d_k\) 奇数为 \(m_1\),偶数为 \(m_2\)

\(d_1\) 为奇数则全局 \(\text{SG} = m_1\),偶数则 \(\text{SG} = m_0\)

倒序遍历 \(d\),用 std::set 动态维护 mex,时间复杂度 \(O(n \log n)\)

http://www.jsqmd.com/news/848061/

相关文章:

  • 2026年第二季度,寻找可靠自行车公司?深度解析行业标杆途锐达right - 2026年企业推荐榜
  • ComfyUI IPAdapter CLIP Vision模型配置完全指南:从基础到高级应用
  • 告别环境配置噩梦:用Docker一键部署GPGPU-Sim模拟器(附避坑指南)
  • 番茄小说下载器:免费开源的多格式小说下载完整指南
  • 查看详细审计日志追溯API调用历史与异常访问
  • 2026年Q2智慧酒店物联网AI大数据核心服务商排行:弱电智能化品牌、弱电智能化报价、弱电智能化改造、弱电智能化方案选择指南 - 优质品牌商家
  • SAP 高级退货流程(供应商)的Fiori应用实战与核心配置解析
  • 嵌入式触摸屏亮度调节实战:从PWM调光原理到软硬件解决方案
  • 告别默认灰:用Qt5.14.2+VS2019和QSS三套皮肤,5分钟让你的Qt应用颜值飙升
  • 多 Agent 协作中人格冲突频发?Hermes Agent 的 4 类 SOUL/USER 分工策略
  • 书匠策AI到底是什么来头?毕业论文写作的“黑科技“我给你扒明白了
  • CAXA 正多边形命令
  • 高效解决Windows依赖问题的智能工具完全指南:Visual C++ Redistributable AIO深度解析
  • 简述从Gemma_4到DeepSeek_V4的架构演进
  • 保姆级教程:在Ubuntu 20.04上用kitti2bag工具把KITTI Raw Data转成ROS Bag(避坑实录)
  • Perplexity企业级部署实战(内部培训绝密文档节选):权限管控、审计日志与SAML单点登录配置详解
  • 2026年Q2川内别墅防水可靠服务商综合排行一览:成都彩钢房防水/成都楼顶防水/成都防水检测/成都防水补漏/楼顶防水/选择指南 - 优质品牌商家
  • Linux块设备驱动开发实战:从内存设备到blk-mq框架详解
  • CTF新手必看:5种音频隐写术的实战破解指南(附工具下载链接)
  • CAXA 公式曲线
  • 嵌入式DMA原理与实战:从CPU解放到高效数据搬运
  • 优之彩的不锈钢实心台面,为什么是厨房装修的“长期主义者”?
  • 2026上海GEO优化技术解析与专业服务商实测参考 - 得赢
  • 别再死记硬背了!用这套‘四层架构’模型,轻松搞定物联网面试(附MQTT/CoAP实战对比)
  • WinDirStat终极指南:如何快速找到并清理Windows磁盘空间
  • Perplexity算法与传统BM25查询评分的本质差异(仅0.3%的AI平台工程师真正理解)
  • 广州小程序定制公司:满足企业多样化需求的理想选择
  • 高级磁盘空间管理:WinDirStat深度配置与自动化清理指南
  • 从Coze多Agent协作到存算一体:揭秘下一代AI系统的算力架构演进
  • 如何让老旧PL2303芯片在Windows 10/11上完美运行:简单三步终极解决方案