20260111模拟赛
20260111模拟赛
无终宴
令 \(s_i\) 表示前 \(i\) 个时间点,第一个人总共可以获得 \(s_i\) 的酒。容易发现 \(n(n+1)\) 是一个周期,每个人一段时间获得的酒可以用一个周期中的某一段表示。令 \(\delta=s_{n(n+1)},g=\gcd(\delta,k)\)。
设最终答案为 \(T=x\times n(n+1)+t\),我们期望找到所有合法 \(t\),然后算出对应的 \(x\)。
\(t\) 合法要满足 \(\forall i,a_i+s_{(i-1)(n+1)+t}-s_{(i-1)(n+1)}\equiv 0(\bmod g)\),令 \(b_i=a_i-s_{(i-1)(n+1)}\),即 \(b_i+s_{(i-1)(n+1)+t}\) 在模 \(g\) 下为 \(0\),且模 \(k\) 下均相等,然后用 \(\delta\) 调整使得模 \(k\) 也是 \(0\)。
枚举 \(t\),用 KMP 对 \(b_i\) 和 \(s_{(i-1)(n+1)+t}\) 比较差分以判断在模 \(k\) 下相等,然后特判模 \(g\) 下是否为 \(0\)。此时设模 \(k\) 下等于 \(d\),则现在要求 \(x\delta\equiv k-d(\bmod k)\),这可以使用 exgcd,由于系数不变可以预处理。
以旧换新
生成序列有多重方法,容易算重。考虑序列 \(a\) 如何变成一个序列 \(b\):
- 从前往后每次找到第一个 \(1\leq x<len\) 的位置使得 \(1\leq i\leq x\{a_i\}=\{b_i\}\) 从这里断开。(等价于所有小于 \(x\) 的位置都不能断)
- 直到找不到时考察最大值最小值的位置,如果相同则这一段就都相同了,否则交换位置继续进行上一步。(此时能断开的位置必然在两交换位置之间)
设 \(f_{l,r,s,t}\) 表示区间 \([l,r]\) 情况是 \(s\),不能被断开的元素集合是 \(t\)。枚举是否交换,再枚举断开位置。
\(s\) 的情况有:最大的和最小的相对位置没变化,最大的变成最小,最小的变成最大
\(t\) 的情况有:全都能断,全都不能断,最大值右边不能断,最小值右边不能断。
- 如果区间不做交换,则可以在 \(t\) 约束下断开。左区间全都不能断,右区间继承 \(t\) 约束;
- 如果区间做交换,则能且只能在两个最值之间断开。左区间全都不能断,右区间在最值右边的位置不能断开。

浙公网安备 33010602011771号