2025.8.27 NOIP 模拟赛 题解
T1 P110120 宇宙(universe)
题意
给定 \(v_{1\sim n}\; (v_i>0)\),对于每个 \(1\le k<n\),依次考虑每个 \(i>0\),第 \(i-\varepsilon\) 秒时选择 \(k\) 个 \(v_x\) 加一,第 \(i\) 秒时需要保证 \(\forall x,v_x>i\),求出最大的 \(i\) 使得存在一种操作方式,到第 \(i\) 秒时仍然合法,\(n\le10^6\)
分析
一个 \(k\) 的答案为
令 \(f(x)=\sum_{t=1}^n \max(0,x+1-v_t)\),显然为一个下凸的分段函数,容易 \(O(n\log n)\) 求出每一段的情况
对于一个 \(k\),容易二分出一次函数和凸包的交点
时间复杂度 \(O(n\log n)\)
注意 \(k\) 单调增加时交点移动是单调的,因此实际可以做到除排序外 \(O(n)\)
T2 P110121 跳跃(jump)
题意
给定一个 \(0/1\) 串 \(s_{1\sim n}\) 和参数 \(k\),\(q\) 次询问,每次给定 \(a,b\),保证 \(s_a=s_b=1\),从 \(a\) 位置出发,每次至多跳跃 \(k\) 的距离(\(a\to [a-k,a+k]\)),求出到达 \(b\) 的情况下移动到 \(0\) 位置的次数最少,部分数据点在此要求的基础上要求步数最少,\(n,q\le 5\times10^5\)
分析
对于一组询问 \((a,b)\),假定 \(a<b\),\(a,b\) 之间极长 \(0\) 段的长度依次为 \(L_{1\sim k}\),则第一问的答案为 \(\sum_i \left\lfloor\frac{L_i}k\right\rfloor\),容易 \(O(n)\) 预处理 \(O(\log n)\) 回答一次,离线则可以做到 \(O(n+q)\)
要求出第二问,先考虑 \(\max L_i<k\) 的情况,此时显然最优方案为从 \(a\) 出发跳到 \((a,a+k]\) 中的一个 \(1\) 的位置,直到 \(a\ge b\),容易倍增求出答案
若 \(L_i\ge k\),则从这段 \(L_i\) 中删去 \(L_i-(L_i\bmod k)\) 个,并将 \(\left\lfloor\frac{L_i}k\right\rfloor\) 计入答案,则转化为以上特殊情况
容易做到时间复杂度 \(O(n\log n+q\log n)\),空间复杂度 \(O(n\log n)\)
T3 P110122 圆环(circle)
题意
一个长度为 \(n\) 的环上两个指针,初始分别在 \(1\) 和 \(n\),两者可以在任意时刻移动任意距离,两者可以重叠和互相穿越,\(m\) 组限制形如第 \(x\) 秒时至少一个指针位于位置 \(y\),求总移动距离的最小值,\(n,m\le3\times10^5\),保证所有限制互不相同,且同一秒至多存在两个限制
分析
先删去不存在限制的秒,将剩下的时间缩起来,令 \(lm_i\) 为 \(i\) 时刻的限制的集合,令 \(lm_0=\{1\}\)
令 \(f_{i,j}\) 表示第 \(i\) 秒结束时一个指针在 \(lm_{i,0}\),另一个在 \(j\) 的最小移动距离,显然 \(f_{0,n}=0\),答案为 \(\min f_m\)
令 \(ds_{a,b}=\min(|a-b|,n-|a-b|)\) 为环上两点之间距离
对于时刻 \(i\),令 \(p=lm_{i-1,0},r=lm_{i,0}\),则转移为
若 \(|lm_i=2|\),令 \(d=lm_{i,1}\),则
发现实际上可以转化为对一个数组 \(dp\) 进行以下几类操作:
- 初始化
- 全设为 \(\infty\)
- 全局加
- 给定 \(t\) 求 \(\min_i (ds(i,t)+dp_t)\)
- 给定 \(p,v\),\(dp_p\gets \min(dp_p,v)\)
- 给定 \(p\) 返回 \(dp_p\)
- 求全局 \(\min\)
线段树维护,每个结点 \([l,r]\) 保存 \(\min_{i=l}^r dp_i,\min_{i=l}^r (dp_i+i),\min_{i=l}^r (dp_i-i)\) 和加法标记,全局置为 \(\infty\) 等价于全局加 \(\infty\),注意范围
总时间复杂度 \(O(n+m\log n)\)
T3 P110123 翻转(reverse)
题意
令 \(R_k(n)\) 表示在 \(k\) 进制下 \(n\) 数位逆序得到的结果,给定 \(k,n\),求出 \(\sum_{x=1}^n [x\mid R_k(x)]\),\(2\le k\le 16,n\le k^{100000}\)
分析
对于合法的 \(x\),显然 \(|R_k(x)|\le |x|\),而 \(x\mid R_k(x)\),因此 \(1\le \frac{R_k(x)}x<k\)
枚举 \(m=\frac{R_k(x)}x\),计算合法的 \(x\) 的数量
先考虑计算 \(|x|<|n|\) 的方案数
令 \(f_{i,a,b,0/1}\) 表示长度为 \(i\),乘以 \(m\) 后,最高位向下一位进位 \(a\),最低位的上一位向其进位 \(b\),当前这一段是否不强制要求无前导 \(0\) 的方案数
显然
考虑一般情况下的转移
枚举最低位的值 \(j\),则乘以 \(m\) 得到 \(mj+b\),进位后剩余 \((mj+b)\bmod k\),从而最高位 \(i=(mj+b)\bmod k\)(因为翻转),若 \(i<c\) 则违背限制直接跳过,否则设转移到的状态为 \(f_{l-2,x,y,0}\),显然有 \(im+x=ka+j,jm+b=i+yk\),从而 \(x=ka+j-im\),\(y=\frac{jm+b-i}k\),若 \(x,y\) 都在 \([0,k)\) 中则可以转移
为了加速,可以预处理每个 \((a,b,c)\) 的后继状态的集合,实际转移较少
这部分对答案的贡献显然为 \(\sum_{l=1}^{|n|-1} f_{l,0,0,1}\),记忆化搜索即可
然后考虑计算 \(|x|=|n|\) 的方案数
令 \(g_{l,a,b,f,r}\) 表示考虑正中间长度 \(l\) 的一段,,乘以 \(m\) 后,最高位向下一位进位 \(a\),最低位的上一位向其进位 \(b\),当前段以前的部分是否紧贴上界,当前段以后的部分是否超过上界,该情况下的方案数
显然对答案的贡献为 \(g_{|n|,0,0,0,0}\)
令 \(n_i\) 表示 \(n\) 从高到低第 \(i\) 位(从 \(0\) 开始),显然
令 \([lm,rm]=\left[[l=|n|],n_{\left\lfloor\frac{|n|-l}2\right\rfloor}\right]\) 为最高位的取值范围,则
令 \(rrm=s_{|n|-1-\left\lfloor\frac{|n|-l}2\right\rfloor}\) 为最低位的限制,枚举 \(lm\le i\le rm\) 为当前最高位,\(0\le j<k\) 为当前最低位,与 \(f\) 类似地 \(x=ka+j-im\),\(y=\frac{jm+b-i}k\)(若 \(y\) 不是整数或 \(x,y\) 超出 \([0,k)\) 则直接返回),令 \(g_{l,a,b,f,r}\) 加上 \(g_{l-2,x,y,[i<rm],[j>rrm]+[j=rrm]r}\)
总时间复杂度 \(O(k^4+k^4|n|)\),其中后一项常数极小
比赛结果
\(100+76+68+8\),\(\text{rk}28\)

浙公网安备 33010602011771号