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\) 约束;
  • 如果区间做交换,则能且只能在两个最值之间断开。左区间全都不能断,右区间在最值右边的位置不能断开。
posted @ 2026-01-23 09:51  programmingysx  阅读(0)  评论(0)    收藏  举报
Title