Loading

我爱学习-More More Counting

CF2134F Permutation Oddness

Diff:*2900

\(4\) 种数,如果要直接 \(\mathrm{dp}\) 造出序列时间复杂度是 \(O(n^5)\) 的,无法接受。考虑挖掘一下 \(\mathrm{lowbit}(b_i,b_{i+1})\) 的性质,注意到若 \(b_i=b_{i+1}\) 值是 \(0\),如果组成 \((0,2),(1,3)\) 则值为 \(2\),其他情况都是 \(1\)。此处考虑一个染色的技巧,将 \(0,2\) 染成红色,\(1,3\) 染成蓝色,则原序列可以刻画成一个红蓝极长连续段交替的形式,这样不同连续段之间的贡献就是 \(1\),同一连续段内相同数贡献是 \(0\),不同数贡献是 \(2\)。我们发现这样似乎比较好做了,因为我们可以将红色和蓝色连续段分开算,然后最后对应超级拼装起来,那么只需思考如何对红色求出方案数,蓝色同理。

考虑定义 \(r(i,j)\) 表示红色连续段个数为 \(i\),这些连续段内部的贡献为 \(j\) 的连续段方案数。只有异色,即交替才有贡献,先考虑一个连续段内部的情况。定义 \(f(i)\) 表示用 \(c_0\)\(0\)\(c_2\)\(2\) 组成的、交替数量恰好为 \(i\) 的方案数,这是一个经典的组合计数,考虑相同数组成的连续段,如果有 \(j\) 个那么交替数量就是 \(j-1\),那么交替数量为 \(i\) 等价于同数连续段有 \(k=i+1\) 个。交替,考虑对 \(k\) 奇偶分类:

\(F(n,m)\) 表示把 \(n\) 个相同数划分成 \(m\) 个连续段的方案数,用插板法得到 \(F(n,m)=\binom{n-1}{m-1}\)

  • \(k\) 为奇数,记 \(k=2m+1\)

    • \(0\) 开头。那么 \(0\) 的连续段有 \(m+1\) 个,\(2\) 的连续段有 \(m\) 个,分别划分后拼接,方案数为 \(F(c_0,m+1)\times F(c_2,m)=\binom{c_0-1}{m}\binom{c_2-1}{m-1}\)

    • \(2\) 开头。那么 \(0\) 的连续段有 \(m\) 个,\(2\) 的连续段有 \(m+1\) 个,同理方案数为 \(F(c_0,m)\times F(c_2,m+1)=\binom{c_0-1}{m-1}\binom{c_2-1}{m}\)

  • \(k\) 为偶数,记 \(k=2m\)

    两者都有 \(m\) 个连续段,区分开头顺序有 \(2\) 种拼接方案,方案数为 \(2\cdot F(c_0,m)\times F(c_2,m)=2\binom{c_0-1}{m-1}\binom{c_2-1}{m-1}\)

再将 \(k\) 变回 \(i\),整理一下,得到:

\[f(2m)=\binom{c_0-1}{m}\binom{c_2-1}{m-1}+\binom{c_0-1}{m-1}\binom{c_2-1}{m} \\ f(2m-1)=2\binom{c_0-1}{m-1}\binom{c_2-1}{m-1} \]

那么考虑用 \(f\) 计算 \(r\),枚举 \(j\) 表示要划分有 \(j\) 个异色相邻的序列,其方案数对应 \(f(j)\),划分时如果切开了两个相同色的则是没有贡献的,如果切开异色的则贡献为 \(-2\),于是枚举 \(k\) 表示有多少个切到了异色位置,选择方案数是 \(\binom{j}{k}\),对于同色部分可以随便放,总共有 \(c_0+c_2-1\) 个位置,\(j\) 个是异色的,则有 \((c_0+c_2-1-j)\) 个同色,划分成 \(i\) 段有 \((i-1)\) 个划分位置,划分异色用了 \(k\) 个,则有 \((i-1-k)\) 个用于划分异色,因此方案数为 \(\binom{c_0+c_2-1-j}{i-1-k}\),综上得到:

\[r_{i,2(j-k)}\leftarrow f_j\times \binom{j}{k}\binom{c_0+c_2-1-j}{i-1-k} \]

同理可以计算出 \(b(i,j)\) 表示蓝色信息。接着就要用 \(r_{i,j}\) 拼装得到 \(ans\),枚举 \(i_r,i_b\) 分别表示红、蓝连续段的个数,不难发现此时有 \(i_b\in [i_r-1,i_r+1]\),这一部分的贡献就是连续段相接的部分,即 \((i_r+i_b-1)\),再枚举 \(j_r,j_b\) 表示红蓝内部的贡献,拼接时再对开头方案数讨论,易得:

\[ans_{i_r+i_b-1+j_r+j_b}\leftarrow (1+[i_r=i_b])\cdot r(i_r,j_r)\times b(i_b,j_b) \]

时间复杂度是 \(O(n^3)\),可以通过。


CF2066D2 Club of Young Aircraft Builders (hard version)

套路地考虑序列合法的充要条件。因为有固定的数存在,所以我们刻画的条件应该是跟位置有关的。考虑在值域上按从小到大的顺序确定每个数能够放的区间。对于 \(1\),其只能放在 \([1,c]\),否则放更大的数会使其非法,对于 \(2\),如果去掉所有 \(1\),其也只能放在 \([1,c]\) 的区间,用 \(cnt_i\) 表示数 \(i\) 放置的数量,由于 \([1,c]\) 已经放置了 \(cnt_1\)\(1\),不难推出 \(2\) 只能放在 \([1,c+cnt_1]\)。由此不难归纳出合法的充要条件是数 \(i\) 的位置都在 \(\left[1,c+\sum\limits_{j<i} cnt_j\right]\)

此时尝试进行 \(\mathrm{dp}\),为了确定范围再确定一维 \(\sum cnt\),定义 \(f_{i,sum}\) 表示已经放好了 \([1,i]\) 的数,\([1,i]\) 中已经放在序列中的数量为 \(sum\) 的填数方案数。转移自然是考虑将 \(i\) 扔进去。枚举 \(i\) 放的个数为 \(k\),则根据数 \(i\) 位置的区间判断,此时数 \(i\) 可以放置的区间就是 \([1,c+sum-k]\),那么可以转移首先需要满足能够确定的 \(i\) 要位于这个区间中,则可以记录数 \(i\) 已经放置的最大位置,判断是否 \(\le c+sum-k\)。然后我们需要计算自由的 \(i\) 的放置方案,在放置区间中已经有 \((sum-k)\) 个位置放置了 \(<i\) 的数,则剩下 \(c\) 个位置,由于 \(i\) 不能放到已经固定的 \(\ge i\) 的位置,所以我们可以先预处理出放置区间中 \(\ge i\) 的数的个数 \(t\),则总共可以放到位置有 \(c-t\) 个。同时我们需要计算能够自由放置的 \(i\) 的数量,再记录放置区间中已经填好的 \(i\) 的个数 \(p\),则可以自由放置 \(k-p\) 个,综上得到转移方程为:

\[f_{i,sum}\leftarrow \sum_{[\texttt{k is valid}]} f_{i-1,sum-k}\times \binom{c-t}{k-p} \]

时间复杂度 \(O(nmc)\)


CF2124F2 Appending Permutations (Hard Version)

Easy Version\(\mathrm{dp}\) 转移太杂乱不方便优化。考虑正难则反,变成后缀上的 \(\mathrm{dp}\),定义 \(f_{i,j}\) 表示考虑 \([i,n]\),且 \(a_i=j\) 的方案数。若 \(j>1\),则可以拆成 \([j,j+1,\dots,s][1,2,\dots,j-1]\),可以预处理 \(p_{i,j}\) 表示从位置 \(i\) 开始的 \([j,j+1,\dots]\) 连续段最远可以走多少步,并记 \(g_{i,j}\) 表示考虑 \([i,n]\),以 \([1,2,\dots ,j]\) 结尾的方案数,那么可以得到 \(j>1\) 的转移为:\(f_{i,j}=\sum\limits_{k=1}^{p_{i,j}} g_{i+k,j-1}\),可以对 \(g_{*,j-1}\) 做前缀和快速计算。若 \(j=1\),则需要保证接上的一段不是 \([1,\dots,k][k+1,\dots]\) 的形式,得到转移:\(f_{i,1}=\sum\limits_{k=1}^{p_{i,1}}\sum\limits_{l\ne k+1} f_{i+k,l}\),优化这个转移方程就是 naive 的,求出 \(f_{i+k}\) 的和记为 \(s_{i+k}\),则 \(f_{i,1}=\sum\limits_{k=1}^{p_{i,1}}(s_{i+k}-f_{i+k,k+1})\)\(g\) 的计算也是简单的,直接枚举 \(j\) 后面接上的数,得到 \(g_{i,j}=\sum\limits_k f_{i+j,k}=s_{i+j}\),同时接上 \([1,\dots ,j]\) 不应是非法的,因此若 \(p_{i,1}<j\)\(g_{i,j}=0\)

至此优化完毕了,总时间复杂度是 \(O(n^2)\) 的,体现了一种正难则反变换转移进行优化的思想,非常厉害。


[ARC192E] Snuke's Kyoto Trip

组合意义天地灭,代数推导报平安。

先考虑没有障碍的情况。我们发现路径方案数仅和横纵坐标差有关,横纵坐标差分别为 \(x,y\) 的路径方案数直接格路计数,为 \(\binom{x+y}{x}\)。由此可以开始逐层巨大精神污染推导:

如果我们限定起点在 \((0,0)\),则枚举终点,答案就是 \(\sum\limits_{x=0}^n\sum\limits_{y=0}^m \binom{x+y}{x}\),着手对其化简:

\[\begin{aligned} f(x,y) &= \sum_{x=0}^n\sum_{y=0}^{m}\binom{x+y}{x} \\ &= \sum_{x=0}^n\binom{x+m+1}{x+1} \\ &= \sum_{x=1}^{n+1}\binom{x+m}{x} = \sum_{x=1}^{n+1}\binom{m+x}{m} \\ &= \sum_{x=0}^{n+1}\binom{m+x}{m}-\binom{m}{m} \\ &= \binom{n+m+2}{n+1}-1 \\ \end{aligned} \]

那么继续枚举起点,答案可以表示为 \(\sum\limits_{x=0}^n\sum\limits_{y=0}^m f(x,y)\),仿照上述方法不难化简:

\[\begin{aligned} g(x,y) &= \sum_{x=0}^n\sum_{y=0}^m f(x,y) \\ &= \sum_{x=0}^n\sum_{y=0}^m \left[\binom{x+y+2}{x+1}-1\right] \\ &= \sum_{x=0}^n\sum_{y=0}^m \binom{x+y+2}{x+1}-(n+1)(m+1) \\ &= \sum_{x=1}^{n+1}\sum_{y=1}^{m+1} \binom{x+y}{x}-(n+1)(m+1) \\ &= \sum_{x=0}^{n+1}\sum_{y=0}^{m+1} \binom{x+y}{x}-\sum_{y=0}^{m+1}\binom{y}{0}-\sum_{x=0}^{n+1}\binom{x}{x}+\binom{0}{0}-(n+1)(m+1) \\ &= f(n+1,m+1)-(m+2)-(n+2)+1-(n+1)(m+1) \\ &= \binom{n+m+4}{n+2}-1-(m+2)-(n+2)+1-(n+1)(m+1) \\ &= \binom{n+m+4}{n+2}-[(n+1)(m+1)+(m+2)+(n+2)] \\ &= \binom{n+m+4}{n+2}-[(n+1)(m+1)+(m+1)+(n+1)+2] \\ &= \binom{n+m+4}{n+2}-[(n+2)(m+2)-1+2] \\ &= \binom{n+m+4}{n+2}-(n+2)(m+2)-1 \\ \end{aligned} \]

于是我们得到了从 \((0,0)\leadsto (n,m)\)不考虑障碍的方案数。如果加上障碍的限制考虑容斥,减去不合法的路径。

尝试对起点所处的位置分类:

  • 如果起点在矩形内部

    此时路径怎么走都是非法的,终点可以在矩形内部或是走出去:

    • 终点在矩形内部。 这等价于在这个矩形里无障碍游走,方案数为 \(g(r-l,u-d)\)

    • 终点在矩形外部。考虑枚举路径从矩形 右/上 边界上的哪些点穿了出去。

      边界上只有 \(O(n+m)\) 个点。假设枚举从 \((x,y)\) 穿出去,注意此时为了防止记重钦定 \((x,y)\) 为第一次穿出,即钦定下一步一定是向矩形外部走。可以将路径拆成两段 \((sx,sy)\leadsto (x,y)\)\((x,y)\leadsto (n,m)\),相当于固定住一端,若是从上跑出去则方案数对应 \(f(x-l,y-d)\times f(n-x-1,m-y)\),从右出去对应 \(f(x-l,y-d)\times f(n-x,m-y-1)\)

  • 如果起点不在矩形内部

    我们要强制让这个起点走到矩形中,同理考虑枚举从 左/下 的哪些点穿进去,不妨设其为 \((x,y)\),同理钦定这个点是第一次进入矩形,此处意义为保证上一步不在矩形内。同样可以拆成两段计算。从左穿进来对应 \(f(x,y-1)\times f(n-x,m-y)\),从下穿上来对应 \(f(x-1,y)\times f(n-x,m-y)\)

于是可以 \(O(n+m)\) 解决。


[ARC199D] Limestone

试图刻画合法条件,等价于每个点左边或者上面是满的,怎么计数,哦不失败。

考虑直接 \(\mathrm{dp}\) 造出合法的矩阵,定义 \(f_{i,j}\) 表示 \(i\times j\) 的合法矩阵的和,为了计算上贡献同时计算 \(g_{i,j}\) 表示合法矩阵的方案数。转移考虑刻画出第 \(i\) 行的形式,可以在第 \(i\) 行进行一次行覆盖操作,同时可以被一些列操作影响到,因此其可以刻画成 \(\texttt{111111...1...1...}\) 的形式,但是不难发现这样会算重,如果出现拐角的形状则被重复统计,因此我们钦定选择的行操作是极大的,那么这一行可以表示为:

\[\underbrace{111\dots 1}_{r\times 1}0\underbrace{\dots1\dots 1\dots}_{c\times 1} \]

于是不难得到转移:

\[\begin{aligned} f_{i,j} &= \sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}[f_{i-1,j-c}+g_{i-1,j-c}(r+c\cdot i)]\times \binom{j-r-1}{c} \\ &= \sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}f_{i-1,j-c}\times \binom{j-r-1}{c}+\sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}g_{i-1,j-c}(r+c\cdot i)\times \binom{j-r-1}{c} \\ \mathrm{lhs} &= \sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}f_{i-1,j-c}\times \binom{j-r-1}{c} \\ &= \sum_{c=0}^{j-1}f_{i-1,j-c}\sum_{r=0}^{j-c-1}\binom{j-r-1}{c} \\ &= \sum_{c=0}^{j-1}f_{i-1,j-c}\sum_{p=c}^{j-1} \binom{p}{c} \\ \mathrm{rhs} &= \sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}g_{i-1,j-c}(r+c\cdot i)\times \binom{j-r-1}{c} \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\sum_{r=0}^{j-c-1}(r+c\cdot i)\times \binom{j-r-1}{c} \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\sum_{p=c}^{j-1}(j-p-1+c\cdot i)\times \binom{p}{c} \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\left[\sum_{p=c}^{j-1}(j-p-1)\binom{p}{c}+i\cdot c\times \binom{p}{c}\right] \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\sum_{p=c}^{j-1}(j-p-1)\binom{p}{c}+\sum_{c=0}^{j-1}g_{i-1,j-c}\times i\times c\times \sum_{p=c}^{j-1}\binom{p}{c} \end{aligned} \]

注意到 \(\sum\limits_{p=c}^{j-1}\binom{p}{c}\)\(\sum\limits_{p=c}^{j-1}(j-p-1)\binom{p}{c}\) 都可以预处理。\(g_{i,j}\) 就简单多了:

\[\begin{aligned} g_{i,j} &= \sum_{r=0}^{j-1}\sum_{c=0}^{j-r-1}g_{i-1,j-c}\times \binom{j-r-1}{c} \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\sum_{r=0}^{j-c-1}\binom{j-c-1}{c} \\ &= \sum_{c=0}^{j-1}g_{i-1,j-c}\sum_{p=c}^{j-1}\binom{p}{c} \\ \end{aligned} \]

注意 \(r=n\) 也是一种合法的转移,需要单独加上。

预处理和 \(\mathrm{dp}\) 的时间复杂度是 \(O(nm^2)\) 的,此处运用经典套路,\(n\times m\)\(m\times n\) 本质相同,所以令 \(S=nm\),时间复杂度是 \(O(S\min (n,m))=O(S\sqrt{S})\),可以通过。


[ARC195E] Random Tree Distance

求和则先求出期望,再乘上总方案数 \((n-1)!\)。距离可以直接写成 \(d_u+d_v-2d_{\mathrm{lca}(u,v)}\)\(d_u\)\(d_v\) 的期望都是可以简单求的,\(E(d_1)=0\)\(E(d_i)=A_i+\frac{1}{x-1}\sum\limits_{i<x} E(i)\),记前缀和即可 \(O(n)\) 递推出,但是 \(\mathrm{lca}(u,v)\) 似乎不好处理,每个点的父亲都是随机的,先尝试拆贡献,考虑 \(\mathrm{lca}(u,v)=x\) 的概率,不妨设 \(u<v\),我们考虑 \(\mathrm{lca}\) 倍增时的做法,是先让两个点跳到同一高度,然后再一起往上跳,所以如果记 \(w(u,v)\) 表示 \(v\) 第一个 \(\le u\) 的祖先,则我们有 \(\mathrm{lca}(u,v)=\mathrm{lca}(u,w(u,v))\)。还有更神的结论,我们声称 \(w(u,v)\)\([1,u]\)均匀分布

证明考虑归纳。

  • 边界:\(v=u+1\),由于 \(p_v\le u\)\([1,u]\) 中均匀分布,且此时有 \(w(u,v)=p_v\),所以 \(w(u,v)\) 此时也在 \([1,u]\) 中均匀分布。

  • 归纳:不妨设 \(v=u+k\),则 \(\forall i\in [1,k-1]\)\(w(u,u+i)\)\([1,u]\) 中均匀分布。

    • \(p_v\le u\),此时直接跳上去了,其在 \([1,u]\) 中也是均匀分布的,相当于给其中每个位置贡献了相同概率
    • 否则 \(w(u,v)=w(u,p_v)\),由于 \(p_v<v<u+k\),所以 \(w(u,p_v)\) 也是均匀分布的。

    因此此时 \(w(u,v)\) 也在 \([1,u]\) 中均匀分布。

证毕。

这是一个非常强的结论,这告诉我们,\(w(u,v)=i\) 都是等概率 \(\frac{1}{u}\)

于是 \(E[\mathrm{lca}(u,v)]=E[\mathrm{lca}(u,w(u,v))]=\dfrac{1}{u}\sum\limits_{i=1}^{u}E[\mathrm{lca}(u,i)]\)。我们发现最终的结果和 \(v\) 是没有关系的!因此 \(v\) 取任何 \(v>u\) 的数都是一样的,因此我们考虑取 \(v=u+1\),则 \(E[\mathrm{lca}(u,v)]=E[\mathrm{lca}(u,u+1)]\)

\(L_i=E(d_{\mathrm{lca}(u,u+1)})=E(d_{\mathrm{lca}(u,i)})\),则可以得到

\[L_i=\frac{1}{u}\sum_{i=1}^{u}E(d_{\mathrm{lca}(u,i)})=\frac{1}{u}\left(E(d_i)+\sum_{i=1}^{u-1} E(d_{\mathrm{lca}(u,i)})\right)=\frac{1}{u}\left(E(d_i)+\sum_{i=1}^{u-1} L_i\right) \]

于是 \(L_i\) 也可以 \(O(n)\) 递推得到。因此总时间复杂度为 \(O(n+q)\)


QOJ977.Local Maxima

独立做到的观察:最大值肯定是作为那个唯一的max,考虑从大到小往里面填的过程,除最大值之外每个数必须要放在之前数已经统治的行和列,并且每增加一个数会新统治一行或一列。

那么考虑这样一个朴素的 \(\mathrm{dp}\),定义 \(f_{x,i,j}\) 表示从大到下放好了 \(nm\sim x\) 的所有数,这些数目前统治了 \(i\)\(j\) 列的方案数,转移是 \(f_{x,i,j}\to \texttt{sth.}\times f_{x-1,i+1,j}\)\(f_{x,i,j}\to \texttt{sth.}\times f_{x-1,i,j+1}\) 状物,表示在某个位置插上一行或一列来放置最大值。但是这样的时间复杂度是 \(O(n^3)\) 的,无法通过。

我们发现 \(x\) 这一维似乎没用,其只是保证了我们将所有数都放进去,并且我们关注的只是剩下能填的数的个数,和目前具体填了哪些数没有关系。为了压掉 \(x\),我们考虑在放置最大值在某一行时将其与已经填好的列的交也顺带填好,列也同理,于是定义 \(f_{i,j}\) 表示目前放好了 \(i\)\(j\) 列,那么之前的填数方法保证了此时已经放好了 \(i\times j\) 个数,转移同样是放置目前剩下的数中的最大值,并为其新开一行或一列,同时直接将其填好。

此处只考虑新开一行,即转移到 \(f_{i+1,j}\)。首先应当找到位置来插这一行,总共有 \((i+1)\) 个位置可以插,之后需要选数放进去,由于钦定了最大值必选,所以剩下的 \(nm-ij-1\) 个数中要选 \(j-1\) 个数放进来,方案数为 \(\binom{nm-ij-1}{j-1}\),放好后此行可以随意排列,方案数是 \(j!\),因此得到转移:

\[f_{i+1,j}\leftarrow (i+1)\binom{nm-ij-1}{j-1}j!\times f_{i,j} \]

列同理。时间复杂度 \(O(nm)\)


[ARC190B] L Partition

脑残暴力计算题。

将这个 \(\texttt{L}\) 型删除看作每次选择上/下边界、左/右边界同时缩短 \(1\) 单位。考虑怎么刻画 \((a,b)\)\(K-\texttt{L}\) 被恰好删掉,那么就是在 \(N-K\) 次收缩后会剩下一个 \(K\times K\) 的区域,而 \((a,b)\) 恰好在这个矩形的外边界上,分类讨论一下:

  • \((a,b)\) 在这个矩形的角上。

    那么之后的那次收缩就有 \(3\) 种方法覆盖这个点,而再之后的 \(K-1\) 次收缩除了最后一次都有 \(4\) 种方法,因此内部的方案数就是 \(3\times 4^{K-2}\)。而对于外部,我们考虑先令这个矩形的左上角为 \((A,B)\),那么四个角可以平移四次做到。那么上边界就有 \((A-1)\) 个单位可以减去,左边界就有 \((B-1)\) 个单位可以减去。我的想法是将这些收缩看作两个独立的上/下边界收缩和左/右边界收缩,那么对于上下边界,就是总共 \(N-K\) 次操作选出来 \((A-1)\) 个用来收缩上边界,方案数就是 \(\binom{N-K}{A-1}\),左右边界就是 \(\binom{N-K}{B-1}\),总方案数就是 \(\binom{N-K}{A-1}\binom{N-K}{B-1}\)。于是这部分可以直接 \(O(1)\) 算。

  • \((a,b)\) 在这个矩形的边(不包括角)上。

    那么同理可以分析出内部的方案数是 \(2\times 4^{K-2}\)。对于外部,我们还是先令 \((A,B)\) 位于这个矩形的上边界,于是根据上面的分析,这个的方案数就是:

    \[\sum_{i=1}^{K-2}\binom{N-K}{A-i-1}\times \binom{N-K}{B-1} \\ =\sum_{i=A-K+1}^{A-2}\binom{N-K}{i}\times \binom{N-K}{B-1} \]

    \(f(K)=\sum\limits_{i=A-K+1}^{A-2}\binom{N-K}{i}\),考虑如何求 \(f(K)\),直接求时间复杂度 \(O(K)\),无法通过,不过由于我们是多组询问,考虑是否可以通过递推求出所有 \(f(K)\)。来推导一下:

    \[ \begin{aligned} f(K) &=\sum_{i=A-K+1}^{A-2}\binom{N-K}{i} \\ &=\sum_{i=A-K+1}^{A-2}\binom{N-K-1}{i}+\sum_{i=A-K+1}^{A-2}\binom{N-K-1}{i-1} \\ &=\sum_{i=A-K}^{A-2}\binom{N-K-1}{i}-\binom{N-K-1}{A-K}+\sum_{i=A-K}^{A-3}\binom{N-K-1}{i} \\ &=f(K+1)-\binom{N-K-1}{A-K}+\sum_{i=A-K}^{A-2}\binom{N-K-1}{i}-\binom{N-K-1}{A-2} \\ &=2f(K+1)-\binom{N-K-1}{A-K}-\binom{N-K-1}{A-2} \\ \end{aligned} \]

    于是递推式:\(f(K+1)=\dfrac{f(K)+\binom{N-K-1}{A-K}+\binom{N-K-1}{A-1}}{2}\)

    解决了!我们于是可以 \(O(N)\) 递推出所有 \(f\),然后这种情况也得到解决。

总时间复杂度 \(O(N+Q)\)

Submission


[ARC187C] 1 Loop Bubble Sort

我怎么那么笨。

先找1-Loop-Bubble-Sort的本质,手玩一下其实就是从前往后将每个前缀最大段循环移位,形式化地,令 \(pre_i\) 表示 \(P[1,i]\) 的最大值,则 \(pre_i\) 相同的每个段 \([l,r]\) 就会进行循环移位,其中 \(l\) 移动到 \(r\)\([l+1,r]\) 中的 \(i\to i-1\)

考虑如何计数,其实我们就是要用各种方法刻画出我们要数的东西,这里考虑对所有合法的 \(P\) 计数,我们称 \(P\) 为合法的,当且仅当存在一种填写 \(Q\) 的方案使得其Sort后得到 \(P\)。对 \(P\) 计数考虑 \(\mathrm{dp}\),为了确定这个数会如何移动,我们需要记录前缀最大值,于是定义 \(f_{i,j}\) 表示考虑 \(P\) 的前 \(i\) 个数,并且前缀最大值为 \(j\) 的方案数。

分讨一下转移:

  • 若使得 \(P_i=j\)
    此时就是让 \(P_i\) 作为一个新的前缀最大段的开头,那么它会被轮换到后面,不过我们需要有办法找到 \(Q\),因此需要满足 \(Q\) 中要么 \(j\) 的位置没有确定,要么这个确定的位置在 \(i\) 后面,用 \(pos_j\) 表示 \(Q\)\(j\) 的出现位置,如果没有则是 \(0\),因此这种转移合法需要满足 \(pos_j\ge i\vee pos_j=0\)。然后枚举从前面的最大值 \(k<j\) 转移过来,那么上一段的开头 \(k\) 会轮换到 \(i-1\),因此需要满足 \(Q_{i-1}=k\vee pos_k=0\),此时有 \(f_{i,j}\leftarrow^+ f_{i-1,k}\)

  • 若使得 \(P_i<j\),此时 \(i\) 会轮换到 \(i-1\)

    • \(Q_{i-1}\ne -1\),那么 \(i\) 一定要填 \(Q_{i-1}\),那直接填即可,\(f_{i,j}\leftarrow^+ f_{i-1,j}\)
    • \(Q_{i-1}=-1\),则这个地方可以填一个:\(Q\) 中没有确定位置的、比 \(j\) 小的、之前的 \(-1\) 没有填过的数。观察到,之前 \(-1\) 处填的数一定是严格小于 \(j\) 的,因为只有前缀最大值所在的位置等于 \(j\),而这个最大值被移动到了后面,因此 \(i-1\) 之前填的位置一定是 \(<j\) 的。记 \(cnt_i\) 表示未在 \(Q\) 中出现的 \(\le i\) 的数个数,\(sum_i\) 表示 \(i\) 之前 \(-1\) 的个数,则选的方案数就是 \(cnt_{j-1}-(sum_{i-1}-1)\),得到转移:\(f_{i,j}=f_{i-1,j}\times [cnt_{i-1}-(sum_{i-1}-1)]\)

Submission


P14256 平局(draw)

我怎么又不会消去类贪心。

核心思路:先考虑一个很强的方法来做最大平局问题,做法要将这个问题刻画到与最优化几乎没有关系,而仅依赖于串的本身性质,这样可以方便地进行计数。

首先相邻两个相同手势可以直接相消掉,一定不劣。考虑用 \(\leftarrow,\rightarrow\) 来表示相邻手势之间的胜负关系,其中 \(\leftarrow\) 表示左侧会被右侧打败,\(\rightarrow\) 表示右侧会被左侧打败,那么原序列可以直接被抽象成胜负序列,并且不难发现,原问题的答案只依赖于这个胜负序列。

考虑对这个胜负序列分析。考察这种形态:\(x\rightarrow y\leftarrow z\),那么 \(x=z\),我们可以消掉 \(y\) 后得到 \(1\) 的平局贡献,然后将这个形态缩掉,分析后可以发现,我们的平局只能由这种形态得到,同时有这种形态我们一定会操作,否则要中间的 \(y\) 有贡献,两端的 \(x,z\) 一定需要被删掉,这样是不优的

因此所有的 \(\rightarrow\leftarrow\) 都会被消掉,由此缩完之后剩下的一定是 \(\leftarrow\dots\leftarrow\leftarrow\leftarrow\mid\rightarrow\rightarrow\rightarrow\dots\rightarrow\)\(\star\))。继续分析,我们发现 \(\leftarrow\leftarrow\) 可以变成 \(\rightarrow\),同理 \(\rightarrow\rightarrow\) 可以变成 \(\leftarrow\),因此 \(\leftarrow\leftarrow\leftarrow\) 可以变成 \(\rightarrow\leftarrow\) 然后贡献 \(1\),同理 \(\rightarrow\rightarrow\rightarrow\) 也可以贡献 \(1\)。因此我们可以先左右分别自己消,消成 \((l\bmod 3)\)\((r\bmod 3)\),然后注意到 \(\leftarrow\leftarrow\rightarrow\rightarrow\) 可以变成 \(\rightarrow\leftarrow\) 然后得到贡献。于是经过分析,我们记左边有 \(l\)\(\leftarrow\),右边有 \(r\)\(\rightarrow\),则贡献就是 \(\lfloor\frac{l}{3}\rfloor+\lfloor\frac{r}{3}\rfloor+[l\bmod 3=2\wedge r\bmod 3=2]\)

于是我们就得到了这个非常强的贪心,考虑直接对这个形态进行 \(\mathrm{dp}\),注意到我们可以增量构造这个形态,前 \(i-1\) 个人比试完后剩下(\(\star\))形态,因此可以用二元组 \((x,y)\) 表示这个形态,然后由于要确定当前的手势,还需要记录最后一个手势是 \(p\)。于是可以用 \(f_{i,x,y,p}\) 表示考虑前 \(i\) 个人进行比试,剩下 \((x,y)\) 形态,并且第 \(i\) 个人出的手势是 \(p\) 的答案和,由于要统计还需要方案数 \(g_{i,x,y,p}\)

考虑如何转移:

  • 下一个填 \(p\)
    那么能直接合并贡献 \(1\)

    \[g_{i+1,x,y,p}\leftarrow g_{i,x,y,p} \\ f_{i+1,x,y,p}\leftarrow f_{i,x,y,p}+g_{i,x,y,p} \]

  • 下一位 \(p\) 克制的手势(\(\rightarrow\)
    这样会把向右的段长度 \(+1\),转移到 \((i+1,x,y+1,(p+2)\bmod 3)\),得到:

    \[g_{i+1,x,y+1,(p+2)\bmod 3}\leftarrow g_{i,x,y,p} \\ f_{i+1,x,y+1,(p+2)\bmod 3}\leftarrow f_{i,x,y,p} \]

  • 下一位填克制 \(p\) 的手势(\(\leftarrow\)
    此处需要分讨一下:

    • \(y=0\)。那么这相当于在左段接上一个,转移:

    \[g_{i+1,x+1,y,(p+1)\bmod 3}\leftarrow g_{i,x,y,p} \\ f_{i+1,x+1,y,(p+1)\bmod 3}\leftarrow f_{i,x,y,p} \\ \]

    • \(y>0\)。那么会在尾部形成一个 \(\rightarrow\leftarrow\),可以消掉并贡献 \(1\),同时从尾部删掉了一个数:

    \[g_{i+1,x,y-1,(p+1)\bmod 3}\leftarrow g_{i,x,y,p} \\ f_{i+1,x,y-1,(p+1)\bmod 3}\leftarrow f_{i,x,y,p}+g_{i,x,y,p} \\ \]

最后再加上剩下的 \(x,y\) 贡献即可。但是因为 \(x,y\) 都是 \(O(n)\) 的,这样是 \(O(n^3)\) 的。考虑优化,注意到 \(x\) 这一维,它是不断递增的,而 \(x\) 最终造成的贡献是 \(\lfloor\frac{x}{3}\rfloor\) 以及 \((x\bmod 3)\),因此考虑将 \(x\) 一维改成记录 \((x\bmod 3)\),然后在 \([x=2]\) 时为 \(\lfloor\frac{x}{3}\rfloor\) 加上 \(1\) 的贡献,那么稍改一下转移:

\[g_{i+1,(x+1)\bmod 3,y,(p+1)\bmod 3}\leftarrow g_{i,x,y,p} \\ f_{i+1,(x+1)\bmod 3,y,(p+1)\bmod 3}\leftarrow f_{i,x,y,p}+[x=2]\cdot g_{i,j,k,p} \\ \]

然后就是 \(O(n^2)\) 了,可以通过。

Submission

posted @ 2025-10-10 09:31  STDJCY  阅读(72)  评论(0)    收藏  举报