Loading

我爱学习

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)\)

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