Live2D

Solution -「NOI Simu.」记忆

Description

  长度为 n 的序列 A 初始全 0, C=0. 第 i0 个时刻对 A 进行如下变换:

  • i[1,n], aiai+i.

  • i[1,n]ai>himodm, aihimodm,CC+1.

给出 q 次询问, 每次给出 k, 求出 Ck 时刻后的值.

Solution

  (嘴巴.)

  一个结论: 每次被赋值的数是 A 的一个后缀.

  另一个结论: 若 ait 时刻被赋值, 则一定在 t+m 时刻被再次赋值.

  由结论一, 先求出 a1 第一次被赋值的位置. 设是 hkt 时刻将它赋值. 那么, 其他所有数都会在 t 时刻被赋值. 对于 ai, 设其第一次被 hk 赋值的时刻为 t, 那么其第一次被赋值的时刻 t 应当有 t[tm,t]. 而因为 hk 是已知的, 所以从 tmt, 以此检查的 h 也是确定的. 而设 ai 进入循环时值为 b, 其被赋值需要满足 hx<kx+b, 若一个区间存在使得 hxkxb<0x, ai 就会被其中的数赋值. 所以对下标建立线段树, 每个区间维护斜率单调栈, 即可 O(nlogn) 线段树二分求出每个数第一次被赋值的时刻.

  对于询问, 我们需要求出若干完整周期的贡献和一段循环前缀的贡献. 前者比较好算. 对于后者, 二分得到被赋值至少一次的后缀 [p,n], 将询问挂在 p 处. 从后往前扫描 a, 每次 a 会失去一些赋值时刻, 建立关于时间的线段树维护历史和即可. 复杂度 O(nlogn) (n,q 同阶.)

posted @   Rainybunny  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2020-07-26 Solution -「洛谷 P6021」洪水
点击右上角即可分享
微信分享提示