2025.4.18 NOI 模拟赛 题解
T1 NFLS #18120. 数据结构训练中心 \(\quad\) P11027 [COTS 2020] 餐厅 Restoran
题意
有 \(n\) 个物品,每个物品需要经过两次操作,物品 \(i\) 第一次操作花费 \(a_i\) 时间,第二次操作花费 \(b_i\) 时间,同一时间只有至多一个物品进行第一次操作,至多一个物品进行第二次操作,\(m\) 次操作,插入新物品,删除一个物品,或求物品的最优排列使得所有物品都完成第二次操作的时间最小,前两种操作完成后及所有操作前需要输出所有物品都完成第二次操作的最小时间,第三种操作不超过 \(10\) 个,输出第一次操作的排列和第二次操作的排列,\(n,m\le2\times10^5\)
分析
经典模型 加工生产调度
离线操作,把所有出现过的物品排序
第三种操作相当于按排序后顺序取出仍然存在的物品,容易维护
线段树中按排序后顺序保存目前存在的物品
转移容易矩乘描述
模拟所有操作即可得到操作一和操作二的答案
时间复杂度 \(O((n+m)\log (n+m))\)
T2 NFLS #17926. 机器人
题意
直线上有 \(n\) 个物体,每个物体都做匀速运动,初始物体 \(i\) 在位置 \(a_i\),速度为 \(0\),\(q\) 次操作,每次操作给定时间,修改一个物体的速度,或查询当前时刻所有物体的坐标的绝对值的最大值,设第一类操作有 \(C\) 个,第二类操作有 \(Q\) 个,则 \(n,Q\le10^5,Q\le5\times 10^5\),操作的时间不降
分析
离线操作,枚举每个物体,随着时间的变化一个物体的位置可分解为若干段,每段都是一个一次函数,总段数为 \(O(n+C)\) 的
绝对值的最大值拆为负数的最小值和正数的最大值中绝对值的较大值,两者计算方式类似
转化为给定 \(O(n+C)\) 条线段,\(O(Q)\) 次查询某个位置上的所有线段中 \(y\) 坐标的最大值
离散化后李超树即可
时间复杂度 \(O((n+m)\log^2(n+m))\)
T3 NFLS #P12965. 我还没有想好标题 \(\quad\) CF1043G Speckled Band
题意
给定长为 \(n\) 的字符串 \(s\),\(q\) 次查询给定一个区间 \([l,r]\),将 \(s[l:r]\) 划分为若干连续子段,满足 \(k\) 个子段中至少有一个出现 \(>1\) 次,求不同子段的种类数的最小值,若无合法划分方案则输出 \(-1\),\(n,q\le2\times 10^5\)
分析
令 \(\text{lcp}(x,y)=\text{lcp}(s[x:],s[y:])\),\(\text{lcs}\) 同理
无合法当且仅当 \([l,r]\) 中字符两两不同,容易 \(O(\sum)\) 判断
若存在两个相同字符,则一定可以划分为 \(CaBaD\) 的形式(其中大写字母为字符串,小写字母为字符,相同字母代表相同字符(串),下同)
因此答案上限为 \(4\)
预处理 \(s\) 及其反串的 \(sa\) 和 \(rk\),则可 \(O(1)\) 比较两个子串是否相等(若比较 \(s[l:r]\) 和 \(s[L:R]\),则两者相等当且仅当 \(r-l+1=R-L+1\) 且 \(\text{lcp}(l,L)\ge R-L+1\)),从而可以 \(O(1)\) 判断一个长度是否为 \(s[l:r]\) 的 \(\text{Border}\)(哈希也可实现这一过程,但是 \(\text{CF}\) 上的数据卡哈希)
答案为 \(1\) 等价于 \(s[l:r]\) 的最小整周期长度 \(<r-l+1\)
考虑枚举 \(d\mid(r-l+1)\),则转化为判定 \(s[l:r]\) 是否存在长为 \(d\) 的周期,即 \(s[l:r]\) 是否存在长为 \(r-l+1-d\) 的 \(\text{Border}\),容易 \(O(1)\) 检测一个 \(d\)
由于 \(d\) 的数量为 \(O(n^\varepsilon)\) 的,因此单个询问中判断这一情况的时间复杂度为 \(O(n^\varepsilon)\)
答案为 \(2\) 当且仅当且 \(s[l:r]\) 为 \(AAB,BAA,ABA\) 型之一
前两种情况相同,只考虑 \(AAB\) 型,使用 P1117 [NOI2016] 优秀的拆分 的方法,令 \(f_i\) 为满足 \(s[i,i+f_i)=s[i+f_i,i+2f_i)\) 的最小正整数,若不存在则为 \(n+1\),显然得到 \(f\) 后可 \(O(1)\) 判断一个 \(s[l:r]\) 是否为 \(AAB\) 型
预处理 \(f\) 时,枚举 \(f\) 的值 \(w\),枚举 \(l\mid p\),令 \(r=l+p\),满足 \(l\ge 1,r\le n\),则对于一个 \(f_i\),若 \(f_i=w\) 则必然存在一组 \((l,r)\) 使得 \(l\in [i,i+f_i)\) 且 \(r\in [i+f_i,i+2f_i)\)
令 \(lp=\text{lcp}(l,r)\),\(ls=\text{lcs}(l-1,r-1)\),\(lss=l-ls,rss=r+lp-1\),则 \(\forall lss\le i\le rss-2w+1\),\(f_i\) 可以取 \(w\)
若从小到大枚举 \(w\),则相当于一个序列初始全为空,每次给定一个区间,对区间中为空的位置赋值,用并查集跳过非空位置即可,总赋值次数为 \(O(n\log n)\) 的,这部分预处理时间复杂度为 \(O(n\log n\alpha(n))\)
然后考虑 \(ABA\) 型的,此时相当于判断区间 \([l,r]\) 是否存在 \(\text{Border}\)
考虑根号分治,先判断是否存在长度 \(\le \sqrt n\) 的 \(\text{Border}\),若不存在长度 \(\le\sqrt n\) 的则可证若存在长度 \(>\sqrt n\) 的,其起始位置对应原串的后缀的排名与 \(l\) 的后缀排名相差不超过 \(\sqrt n\),即枚举 \(l\) 后缀排名前后 \(\sqrt n\) 个判断即可,单组询问时间复杂度为 \(O(\sqrt n)\)
若答案为 \(3\),则 \(s[l:r]\) 为 \(aBaC\),\(BaCa\),\(BAAC\) 型之一(显然其他情况一定不优),前两种情况只需要预处理每个位置前第一个与之相同的位置 和 每个位置后第一个与之相同的位置即可,预处理 \(O(n)\),单次询问 \(O(1)\)
对于 \(BAAC\) 的情况,由之前得到的 \(f\) 数组容易处理出 \(rp_l\),表示对于左端点 \(l\),\(rp_l\) 为最小的右端点,满足 \(s[l:rp_l]\) 存在一个子段为 \(AA\) 型的,预处理时间复杂度 \(O(n)\),单次判断 \(O(1)\)
总时间复杂度 \(O(n\log n\alpha(n)+q\sqrt n)\),实际上 \(O(\sqrt n)\) 的部分可以做到 \(O(\log^2 n)\) 甚至 \(O(\log n)\),这样时间复杂度为 \(O(n\log n\alpha(n)+q(\log n+n^\varepsilon))\)
比赛结果
\(100+100+20\),\(\text{rk}28\)

浙公网安备 33010602011771号