2021.4 做题记录

P4223 期望逆序对

注意到期望的线性性,所以这类题目的做法一般都是单独考虑一对数之间的贡献是多少
我们用 \(f[t][i][j][0/1]\) 表示第 \(t\) 轮,两个数分别在 \(i,j\),对答案是否有贡献
转移可以利用前缀和转移,这样的复杂度是 \(\mathcal O(n^2k)\)

考虑两个数 \(a_i,a_j\),设他们两个数开始的位置是 \(A,B\),其他的位置是 \(C\),那么最终的位置一共只有 7 种可能性
\((A,B),(A,C),(B,A),(B,C),(C,A),(C,B),(C,C)\)
这几种位置关系之间是可以递推的,递推的过程中可以使用矩阵乘法来加速 dp
考虑最后如何计算贡献
不妨设 \(a_i<a_j\),那么有
\((A,B)\) 的贡献为 \(0\)
\((B,A)\) 的贡献为 \(1\)
\((A,C)\) 的贡献为 \(\dfrac{A-1}{n-2}\)
\((B,C)\) 的贡献为 \(\dfrac{B-2}{n-2}\)
以此类推
我们枚举 \(A,B\),用树状数组维护计算贡献即可

code

Chaotic Merge

考虑对于两个固定的串 \(s,t\) 怎么求方案数
\(f[i][j][0/1]\) 表示现在 \(s\) 取到了第 \(i\) 位,\(t\) 取到了第 \(j\) 位,上一次取的是 \(s\) 串还是 \(t\) 串即可
但是现在要求求这个东西的和
首先考虑 \(l_1=l_2=1\) 的情况,那么只需要把所有位置上的 \(f\) 值加起来即可
如果起点不是从开头,我们只需要对于每个起点的 dp 值 +1,然后再跑 dp 就可以了,这个思路非常的巧妙
但是注意这个时候还需要考虑有一个取的子串是空的问题,只需要最后减掉就可以了

\(\mathcal O(|s||t|)\)

code

CF1374E2 Reading Books (hard version)

考虑枚举 \(ab\) 类型的书选了几本
那么必须 \(a\) 类型必须选的本数和 \(b\) 类型必须选的本数就已经知道了
剩下的随便选就可以了
用一个 set 或者权值线段树维护就可以了

code

P5280 [ZJOI2019]线段树

我们用 \(f_u\) 表示 \(u\) 这个节点在几个线段树上被打了 tag
我们可以把选段淑上的这些点分为五类

一类点:更新时递归到的,但是没有被完整包含的区间
二类点:更新时递归到的,被完整包含的区间(即递归的叶子节点)
三类店:一类点,二类点的兄弟,且不是一类点或二类点的点
四类点:二类点的子树里的点
五类点:三类点的子树里的点

考虑 \(f\) 数组的更新

一类点:更新之后标记全部被下传,所以 \(f_u=f_u\)
二类点:更新之后这部分全部被打伤标记,所以 \(f_u=k+f_u\),其中 \(k=2^{之前的修改个数}\)
三类点:发现只要这个点到根的路径上的点中有一个被打上了标记,就是可以的,但是发现这个东西没有办法维护,所以我们还需要维护一个 \(g_u\),表示 \(u\) 在每一棵线段树中,到根节点路径上有 tag 的点有几个

重新考虑上面的转移,发现在五类点的时候 \(g\) 数组无法继续转移了
所以换一下 \(g\) 数组的定义,用 \(g\) 表示 \(u\) 在每一棵线段树中,到根节点路径上没有 tag 的点有几个

这样就可以转移了

一类点:\(f_u=f_u,g_u=g_u+k\)
二类点:\(f_u=k+f_u,g_u=g_u\)
三类点:\(f_u=f_u+g_u,g_u=g_u+g_u\)
四类点:\(f_u=2f_u,g_u=g_u\)
五类点:\(f_u=2f_u,g_u=2g_u\)

用线段树维护即可

code

CF981F Round Marriage

考虑二分答案
然后问题转化成了一个二分图匹配问题
只需要判断是否存在完美匹配
根据 Hall 定理,一个二分图存在完美匹配的充分必要条件是,\(X,Y\) 为左右点集(不妨设 \(|X|<|Y|\))对于 \(X\) 的任意子集 \(W\),设 \(N(W)\) 表示于 \(W\) 中的点直接相邻的点,有 \(|W|\leq |N(W)|\)
发现影响答案的只有 \(i\sim j\) 的连续一段
合法的情况为 \(r_j-l_i\geq j-i\)
移项,用单调队列维护 \(l_i-i\) 的最大值即可
注意 \(i=j\) 也是可以的,所以要先入队再求值
注意二分下界是 \(0\)

code

P5481 [BJOI2015] 糖果

显然,式子是

\[A^n_{\binom{k+m-1}{k-1}} \]

所以问题转化成求组合数

\[\binom{k+m-1}{k-1}=\dfrac{(k+m-1)!}{(k-1)!m!}=\dfrac{\prod_{j=k}^{k+m-1}j}{m!} \]

发现 \(m\) 非常的小,所以我们直接对 \(m!\) 分解质因数,然后枚举质因数的倍数,在分子里除掉就可以了

code

P4569 [BJWC2011]禁忌

显然的 AC 自动机上 dp
如果走到了 end 节点,那么下一个必须转移到 1,同时计算一下答案
注意这里我们不能够直接转移答案,而是转移走到那里的概率然后再统计答案
这样做的原因是我们如果转移答案的话,最后我们无法确定每个期望的概率是多少
所以我们用 \(tot+1\) 这个点储存答案,遇到 end 节点就往那里转移即可
复杂度为 \(\mathcal O((n|T|)^3\log len)\)

code

CF626E Simple Skewness

有一个并不显而易见的结论
那就是中位数只能出现在每个数上
证明感性理解
考虑排序之后枚举中位数 \(x\)
那么接下来选的就只能是 \(x-k\sim x,n-k+1\sim n\)
我们考虑二分这个 \(k\),发现随着 \(k\) 的变大,每次新加进来的 \(x,y\)\(\dfrac{x+y}{2}\) 会越来越小,逐渐对平均数为负贡献
所以二分 \(mid\),比较 \(k=mid\)\(k=mid-1\) 时的答案哪个大即可

code

CF1251F Red-White Fence

考虑枚举 \(b_i\),周长可以转化为 \(2b_i+\)选了几个 \(a\)+2
发现如果有两块长度相同的木板,和有三块是完全一致的
所以分类讨论,设有 \(x\) 个只出现了一次的木板的长度的个数,\(y\) 表示出现了至少两次的木板的个数
那么第一类中选了 \(i\) 个木板的方案数就是 \(2^x\binom{x}{i}\),第二类是 \(\binom{2y}{i}\)
解释一下第二类,我们把每个木板拆成两个,选第一个表示放在左边,选第二个放在右边
把上面这个东西写成一个多项式的形式,卷起来就好了

code

P4389 付公主的背包

一个物品的生成函数 \(A(x)=\dfrac{1}{1-x^V}\)
直接把这些物品乘起来显然会爆炸,并不显然的想到取对数变成加法

\[\ln (1-x^V)=G(x) \]

\[\dfrac{-Vx^V-1}{1-x^V}=G^\prime(x) \]

\[-\sum_{k=0}Vx^{V-1+kV}=G^\prime(x) \]

\[G(x)=\sum_{k=0}\dfrac{x^{V(k+1)}}{k+1} \]

所以我们对于每个 \(V\) 统计有几个,\(\mathcal O(n\ln n)\) 的时间内可以搞出来这个多项式

所以我们 exp 再 inv 一下就好了

code

U156130 Up and Down

\(f[i][j]\) 表示放了前 \(i\) 个数时,左半边放了 \(j\)
\(i\) 个数可以选择放在左边或者右边
放在左边时,\(i\) 左边的所有比他大的数都要和他交换一次
放在右边时,\(i\) 右边所有比他大的数都要和他交换一次
直接转移即可

code

U156129 Sequence

考虑 \(i<j\),如果 \(a_i\geq a_j\),那么显然有 \(X_i>X_j\)
同理如果有 \(b_i\leq b_j\),那么有 \(X_i<X_j\)

考虑把每个 \(x\) 连向上一个 \(x\),把每个上一个 \(x-1\) 连上 \(x\),最后用优先队列跑拓扑即可
考虑这样做的正确性,\(x+1\)\(x\) 不会有影响,因为上一个 \(x\) 影响 \(x\),\(x+1\) 影响上一个 \(x\),所以可以传递

code

P1034 [NOIP2002 提高组] 矩形覆盖

考虑搜索,枚举每个点位于哪个矩形,每个矩形维护四个定点的坐标,剪枝就是减掉如果有两个矩形重复的情况
数据比较水,可以通过

code

P5165 xtq的棋盘

显然这个东西可以高斯消元
并且是可以 \(\mathcal O(n)\) 消的,这样可以拿到 70 分
显然 100 分就是让你推通项了
观察这个式子

\[E(x)=pE(x-1)+(1-p)E(x+1)+1 \]

\[E(x)-pE(x-1)=(1-p)E(x+1)+1 \]

两边同时配上一些 \(E(x)\)

\[pE(x)-pE(x-1)=(1-p)E(x+1)-(1-p)E(x)+1 \]

\(F(x)=E(x)-E(x-1)\),显然有 \(F(n)=1\)

\[pF(x)=(1-p)F(x+1)+1 \]

\[F(x)=\dfrac{1-p}{p}F(x+1)+\dfrac{1}{p} \]

化成这个样子就可以用生成函数或者特征根求出通项了
为了方便我们把 \(0\) 当成 \(n\),那么最后的通项是

\[F(n)=\dfrac{2p-2}{2p-1}(\dfrac{1-p}{p})^n+\dfrac{1}{2p-1} \]

求前缀和

\[S(n)=\dfrac{2p-2}{2p-1}\cdot \dfrac{1-(\frac{1-p}{p})^n}{1-\frac{1-p}{p}}+\dfrac{n}{2p-1} \]

然后差分一下就可以得到 \(E(m)\) 了,但是这个做法只能在 \(p\neq \frac{1}{2}\) 的时候适用
\(p=\frac{1}{2}\) 发现是一个等差数列,直接特判掉就好了

code

CF183D T-shirt

考虑 dp,显然有非常暴力的 \(\mathcal O(n^2m)\) 的做法
\(f[i][j][k]\) 表示前 \(i\) 个人,有 \(k\) 个人的尺寸为 \(j\) 的概率
\(g[i][j]\) 表示第 \(i\) 个尺寸,带了 \(j\) 件,期望能够送出多少件
最后我们只需要对于 \(g\) 来背包就可以了

\[g[i][j]=\sum_{k=1}^j kf[i][j][k]+\sum_{k=j+1}^m jf[i][j][k] \]

观察这个式子,显然有 \(\sum_{k=1}^m g[i][k]=1\)

\[g[i][j]-g[i][j-1]=\sum_{k=j}^m f[i][j]=1-\sum_{k=1}^j-1 f[i][j][k] \]

显然 \(g[i][j]-g[i][j-1]\) 对于相同的 \(i\) 单调递减
所以我们可以贪心每次选择一个 \(\Delta g\) 最小的那个
我们边选边做 \(dp\),然后就可以在 \(\mathcal O(nm+n^2)\) 的时间解决了。
思路非常的绕,主要难度在于想到 \(g[i][j]-g[i][j-1]\) 的性质以及接下来的贪心,代码难度也很高

code

posted @ 2021-04-01 08:37  YuukiYumesaki  阅读(63)  评论(0编辑  收藏  举报