挺有意思的计数题,希望下次可以做出来类似的题目。
一个显然的转化是把 \(p\) 数组转换成记录每个位置的人数的 \(f\) 数组,于是我们需要求每种情况下的 \(\sum f_i a_i\) 。
首先需要一些观察,初始 \(f\) 数组每个位置都是 1 ,放置 attraction 的操作相当于把连续的三个值 merge 起来,并且在左右补上 0 ,归纳一下就很容易发现 \(f\) 数组合法当且仅当:
-
\(\exists L,R \in [1,n] \ s.t. L \leq R, \forall i\in [L,R] f_i>0 ,\forall i \notin [L,R] f_i=0\)
-
\(\forall i \in (L,R) f_i \mod 2 =1\)
-
\(\sum f_i =n\)
假设我们枚举出 \(R-L+1=K\) ,一个很巧妙的想法是利用除了端点的 \(f_i\) 都是奇数这一点构造一个和 \(f\) 一一对应的 \(g\) 数组,其中
-
\(f_L=2g_L+x\)
-
\(f_R=2g_R+y\)
-
\(\forall i\in (L,R) f_i=2g_i+1\)
这样的好处是,此时的 \(g\) 数组只有 \(\sum 2g=n-(K-1)-x-y\) 的限制,这是我们会做的形式。
现在要求所有情况下的 \(\sum g_i a_i\) 再加上一些和 \(x,y\) 有关的东西。
当然可以推式子,但一个比较简单的想法是:我们先假设固定了左右端点,观察到中间这些位置本质相同,所以 \(E(g_i)=\frac{S}{2K}\),\(\sum g_i a_i=\sum E(g_i) a_i \times ways\) ,
\(ways\) 表示这 \(K\) 个 \(g\) 的分配方案(插板法)。
于是对于左右端点不固定的情况,我们只需要算出来所有长度为 \(K\) 的子串和就可以很方便地处理,时间复杂度线性或者带一个 \(\log\) 。