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\),用树状数组维护计算贡献即可
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|)\)
CF1374E2 Reading Books (hard version)
考虑枚举 \(ab\) 类型的书选了几本
那么必须 \(a\) 类型必须选的本数和 \(b\) 类型必须选的本数就已经知道了
剩下的随便选就可以了
用一个 set 或者权值线段树维护就可以了
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\)
用线段树维护即可
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\)
P5481 [BJOI2015] 糖果
显然,式子是
所以问题转化成求组合数
发现 \(m\) 非常的小,所以我们直接对 \(m!\) 分解质因数,然后枚举质因数的倍数,在分子里除掉就可以了
P4569 [BJWC2011]禁忌
显然的 AC 自动机上 dp
如果走到了 end 节点,那么下一个必须转移到 1,同时计算一下答案
注意这里我们不能够直接转移答案,而是转移走到那里的概率然后再统计答案
这样做的原因是我们如果转移答案的话,最后我们无法确定每个期望的概率是多少
所以我们用 \(tot+1\) 这个点储存答案,遇到 end 节点就往那里转移即可
复杂度为 \(\mathcal O((n|T|)^3\log len)\)
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\) 时的答案哪个大即可
CF1251F Red-White Fence
考虑枚举 \(b_i\),周长可以转化为 \(2b_i+\)选了几个 \(a\)+2
发现如果有两块长度相同的木板,和有三块是完全一致的
所以分类讨论,设有 \(x\) 个只出现了一次的木板的长度的个数,\(y\) 表示出现了至少两次的木板的个数
那么第一类中选了 \(i\) 个木板的方案数就是 \(2^x\binom{x}{i}\),第二类是 \(\binom{2y}{i}\)
解释一下第二类,我们把每个木板拆成两个,选第一个表示放在左边,选第二个放在右边
把上面这个东西写成一个多项式的形式,卷起来就好了
P4389 付公主的背包
一个物品的生成函数 \(A(x)=\dfrac{1}{1-x^V}\)
直接把这些物品乘起来显然会爆炸,并不显然的想到取对数变成加法
所以我们对于每个 \(V\) 统计有几个,\(\mathcal O(n\ln n)\) 的时间内可以搞出来这个多项式
所以我们 exp 再 inv 一下就好了
U156130 Up and Down
用 \(f[i][j]\) 表示放了前 \(i\) 个数时,左半边放了 \(j\) 个
第 \(i\) 个数可以选择放在左边或者右边
放在左边时,\(i\) 左边的所有比他大的数都要和他交换一次
放在右边时,\(i\) 右边所有比他大的数都要和他交换一次
直接转移即可
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\),所以可以传递
P1034 [NOIP2002 提高组] 矩形覆盖
考虑搜索,枚举每个点位于哪个矩形,每个矩形维护四个定点的坐标,剪枝就是减掉如果有两个矩形重复的情况
数据比较水,可以通过
P5165 xtq的棋盘
显然这个东西可以高斯消元
并且是可以 \(\mathcal O(n)\) 消的,这样可以拿到 70 分
显然 100 分就是让你推通项了
观察这个式子
两边同时配上一些 \(E(x)\)
设 \(F(x)=E(x)-E(x-1)\),显然有 \(F(n)=1\)
化成这个样子就可以用生成函数或者特征根求出通项了
为了方便我们把 \(0\) 当成 \(n\),那么最后的通项是
求前缀和
然后差分一下就可以得到 \(E(m)\) 了,但是这个做法只能在 \(p\neq \frac{1}{2}\) 的时候适用
当 \(p=\frac{1}{2}\) 发现是一个等差数列,直接特判掉就好了
CF183D T-shirt
考虑 dp,显然有非常暴力的 \(\mathcal O(n^2m)\) 的做法
设 \(f[i][j][k]\) 表示前 \(i\) 个人,有 \(k\) 个人的尺寸为 \(j\) 的概率
设 \(g[i][j]\) 表示第 \(i\) 个尺寸,带了 \(j\) 件,期望能够送出多少件
最后我们只需要对于 \(g\) 来背包就可以了
观察这个式子,显然有 \(\sum_{k=1}^m g[i][k]=1\)
显然 \(g[i][j]-g[i][j-1]\) 对于相同的 \(i\) 单调递减
所以我们可以贪心每次选择一个 \(\Delta g\) 最小的那个
我们边选边做 \(dp\),然后就可以在 \(\mathcal O(nm+n^2)\) 的时间解决了。
思路非常的绕,主要难度在于想到 \(g[i][j]-g[i][j-1]\) 的性质以及接下来的贪心,代码难度也很高