题目泛刷记录
P2053 [SCOI2007]修车
题目分析
看一眼数据范围可判断出多半是网络流
尝试建模,但是这道题有可能一个修理工会修理多辆车,也就是说他修第二辆车及以后的车的时间无法得知
这就阻碍了我们统计答案
但是我们并不需要得知他修第二辆车的时间,我们需要知道的是顾客等待的总时间
也就是说我们只要通过一些手段将这些贡献加到最终答案里去就行了
设 (w_i) 为修好第 (i) 辆车所需的时间
对于一个修 (n) 辆车的修理工,他服务的顾客等待时间的总和为:(w_1+(w_1+w_2)+cdots+(w_1+cdots+w_n)=w_1 imes n+w_2 imes(n-1)+cdots+w_n)
我们可以将每个修理工拆成 (n) 个点,编号为 (1sim n),如果有流量从车代表的点流入 (i),就表示这辆车是修理工按顺序修的第 (i) 辆车
根据上文的推导,这辆车对答案的贡献是 (w_i imes(n-i+1))
通过这样的转化,我们可以直接进行统计,考虑一下建模方式:
(n) 辆车,(m) 个修理工,对于每个修理工 (i),他修好第 (j) 辆车所需的时间为 (w_{i,j})
- 以每辆车为一个点,编号为 (1sim n),将每个修理工拆成 (n) 个点,编号为 (n+1sim n+n*m),共计 (n+n imes m) 个点
- 从原点向每辆车代表的点 (i) 连边,容量为 (1),费用为 (0)
- 从每个修理工拆出的点 (n+i*n+j) 向终点连边,容量为 (1),费用为 (0)
- 从每辆车代表的点向每个修理工拆出的点 (i o j*n+k) 进行连边,容量为 (1),费用为 (w_{j,i}*k)
最后跑一遍最小费用最大流即可
CF954H Path Counting
题目分析
这题很容易误入歧途
我们可以通过枚举当前层数,用 (ans_{i,o}) 表示与第 (i) 层距离不超过 (o) 的,位于第 (i+1) 层上面的点的个数
这样我们就可以直接转移计算答案了
吗?
容易发现两个层数相同的点之间的这条路径会对答案做两次贡献
而这些贡献是很难处理的
正难则反,我们将所有路径都统计两次,这样一来最后答案除以 (2) 即可
我们用 (down_{i,o}) 表示由第 (i) 层的点向下走长度为 (o) 的路径的方法数,立得:
然后我们就可以通过转移来求解答案了,设 (ans_{i,o}) 为第 (i) 层走长度为 (o) 的路径的方法数,立得:
顺推统计答案即可,这题细节比较多
CF451E Devu and Flowers
题目分析
敢想敢做,暴力是上策
直接设答案数为 (F(n)),不难看出其普通生成函数为 (prodlimits_{i=1}^ndfrac{(1-x^{f_i})}{1-x})
我们要求的恰恰就是 (x^s) 项的系数
考虑分开做,题目中给出了 (nle20),手玩一下发现大概一百万的样子,于是分子就可以直接暴力展开
再考虑分母,发现分母是一个经典形式 (dfrac{1}{(1-x)^n}),直接组合意义打开,第 (i) 项的系数是 (dbinom{i+n-1}{i})
发现 (s) 很大,直接上阶乘肯定是不行的,但是我们又可以很快发现分子与分母都很大,于是直接展开,上下阶乘消一下
这样计算一个组合数的时间复杂度就是 (O(n)) 的了
然后就是枚举每一项乘在一起,时间复杂度约为 (O(n2^n))
CF839D Winter is here
题目分析
开题首先一眼数据范围,(a_ile10^6,nle2 imes10^5),排除暴力
稍加思考,根据 (a_i) 的范围,再结合这题是一个数论形式的统计,不难想到可以枚举公因数统计答案
在公因数为 (k) 的情况下,我们要求出所有的子序列长度,然后乘上 (k),统计
但是会有重复统计的情况,不难发现重复统计的都是 (k) 的倍数
对于每个要统计的数 (i),它的倍数肯定在这之前就已经计算过,所以我们直接拿来用,直接减掉即可
BZOJ2839 集合计数
题目分析
要求选定集合的交集恰好为 (k),并不是很好考虑,但是我们可以考虑至少为 (k) 的情况
不难想到,只要我们能保证我们选出来的集合的交集中有我们知道的某 (k) 个数,那么剩下的怎么选都是合法的
于是我们强制选定 (k) 个元素,即为交集必定会有的那 (k) 个,方法数 (dbinom n k)
然后剩下的数的幂集中随便选,即选择一个子集,方法数 (2^{2^{n-i}}-1)
我们设一个函数 (g(i)) 来表示这个,即 (g(i)=dbinom n k(2^{2^{n-i}}-1))
然后我们就可以考虑正好为 (k) 个时的情况的方案数 (f(i))
不难发现 (g(k)) 其实就是 (ige k) 时,(f(i)) 的选取方式加起来,并且 (i) 在上指标的位置,即 (g(k)=sumlimits_{i=k}^ndbinom i kf(i))
这显然是一个二项式反演的形式,大力反演即得 (f(k)=sumlimits_{i=k}^n(-1)^{i-k}dbinom{n}{k}dbinom{n-k}{i-k}(2^{2^{n-i}}-1))(二项式系数做了一个小小的变换)
注意事项
如果您最后的乘法写成了 (f(k)=sumlimits_{i=k}^n(-1)^{i-k}dbinom{n}{k}dbinom{n-k}{i-k}2^{2^{n-i}}) 当然在bzoj上也是能A掉的,不过您可以试试这组数据:
in: 768 768
out: 1
wrong answer: 2
这是因为选择空集和全部不选效果是一样的
P2000 拯救世界
来道生成函数题水水也不错呢
题目分析
限制一眼OGF
直接组合意义将OGF展开就做完了
P5505 [JSOI2011]分特产
题目分析
每个人至少分得一个特产不就是恰好每个人都分得特产么
老套路,设 (f(i)) 为至少 (i) 个人没有特产,(g(i)) 为恰好 (i) 个人没有特产
我们对每个特产顺次分配,发现这个过程就是解一个方程:
其中 (n_i) 为第 (i) 种特产的数量,我们要求的即为这个方程的非负整数解的个数
立即得:(f(k)=dbinom n kprodlimits_{i=1}^mdbinom{n_i+n-k-1}{n+k-1})
然后我们和 (g) 联立一下,(f(i)=sumlimits_{j=i}^ndbinom j if(j))
大力二项式反演:(g(0)=sumlimits_{i=0}^n(-1)^if(i)=sumlimits_{i=0}^n(-1)^idbinom n iprodlimits_{j=1}^mdbinom{n_j+n-i-1}{n+i-1})
直接做就可以了
P4859 已经没有什么好害怕的了
我害怕儒略日,还害怕你出毒瘤题
题目分析
由之前的套路,我们只需要求出一个 (f(i)),表示 (n) 个数中糖果比药片能量大的组数至少为 (i) 的方案数
而在这道题目中,(f(i)) 并不可用常规的组合式子表示出来
我们发现如果知道前 (n-1) 组的 (f(i),f(i-1)) 函数值就能很方便表示 (n) 组时的 (f(i))
计算方式跟动态规划一样,于是我们设 (f_{i,j}),表示前 (i) 组至少有 (j) 组被配对了的方案数
显然有 (f_{i,j}=f_{i-1,j}+xf_{i-1,j-1})
(x) 怎么表示出来呢,不难想到如果这一组被配对成功了,那么在药片组里选择的一定是能量比其小的
我们并不知道,即使知道了也没有记录,即使记录了也不能很好处理前 (j-1) 组中被选择的
似乎陷入了困境
但是题目中求的只是方案数,也就是说不管你动态规划怎么循环,正序倒序欧拉序dfs序都是可以的
于是将其进行排序
如果从大至小排序,那么依然不好统计,我们选择将两个数组从小至大排序
这样,设 (Y_i) 表示 (B) 中小于 (A_i) 的元素的个数,立即可得
然后求 (f(i)) 与 (g(i)) 的关系式:
这是个裸的二项式反演,答案即为
AT2000 [AGC002F] Leftmost Ball
又是你谷评分过高的水题一道~
题目分析
读完题后不难发现这题就是求 (n) 个白球,(n imes(k-1)) 个有颜色的球排成一列的方案数,并满足从头开始到任意位置不同的颜色数量少于等于白球数
直接考虑动态规划,设 (f_{i,j}) 表示我们现在用了 (i) 个白球,(j) 种不同颜色的球,每种颜色都是 (k-1) 个都用上的方案数
不难发现 (f_{i,j}=f_{i-1,j}+xf_{i,j-1})
这 (x) 老折磨王了,考虑如何计算 (x)
我们需要知道对于每种方案第 (j) 个白球之后的非白球数量,这样我们才能向里面加球
但是不同方案之间显然这个数量是不同的
似乎陷入了绝境,难道动态规划注定失败么
此时恰好午休,我关掉电脑回到宿舍,躺在床上反复想,动态规划肯定是没有问题的,但是如何统计 (x) 是问题
我想到对于 (f_{i,j-1} o f_{i,j}) 时,就是加了一种颜色,相当于在第 (j) 个白球后插球,或者说撒点
对于 (f_{i-1,j} o f_{i,j}) 就是从左往右第一个空位上放个白球
等等!!插球会导致长度变化,所以我们不能方便统计 (x),但是我们最后的球序列的长度固定, 也就是说
我们可以将插球,转变为在 (n imes k) 个空位上放球的过程!
这题已经做完了,固定左端点,方案数即为
动态规划碾这个式子即可
如果这题没恶评那么就是阿x与桃x的行为
P4389 付公主的背包
生成函数水题一道~(我也就只会数数了QAQ)
题目分析
显然每种方案其实就是对每个体积的一个分拆
那么最直接的想法是:我们不急不慌抄个分拆数的生成函数,直接推导应该这题就没了吧
事实就是这样,小编也很惊讶
直接做即可,其中,((1)) 处:
P5748 集合划分计数
exp水题一道~
题目分析
熟知Bell数 (B(n)) 即是答案,而Bell数的生成函数也是众所周知的:(e^{e^x-1})
(e^x-1) 是可以直接展开的,剩下的只需要一个exp就行了
P5104 红包发红包
算是开始接触期望毒瘤题吧,听说连续型随机变量题很少见
题目分析
分布函数 (F(x)):
熟知连续型随机变量期望
设已经有 (k-1) 个人领完了红包,接下来 (w=dfrac w{2^{k-1}})
即第 (k) 个人期望领到 (dfrac w {2^k}) 元
SP1026 FAVDICE - Favorite Dice
我:期望比多项式难
题目分析
对于 (n) 个球,每个球都有一种与其他球不同的颜色,我们要从这些球中选出一个特定的球
此时,概率是 (dfrac 1 n),期望是 (n)
相信您已经悟出了真理
设 (f_i) 表示已经翻出了 (i) 个面
设现在翻出了 (i-1) 个面,现在我们要翻出第 (i) 个不同的面,概率显然是 (dfrac{n-i+1}{n})
动态规划碾过去即可
P1297 [国家集训队]单选错位
题目分析
依然是分析概率,对于 (a_i) 与 (a_{i+1})
-
(a_ige a_{i+1}) 也就是说这一题的选项比上一题少,我们上一题选到 (1sim a_{i+1}) 的几率是 (dfrac{a_{i+1}}{a_i}),选对的期望是 (dfrac{a_{i+1}}{a_i}dfrac1{a_{i+1}}=dfrac 1 {a_i})
-
(a_i<a_{i+1}) 仿照上例,期望为 (dfrac1{a_i}dfrac{a_i}{a_{i+1}}=dfrac 1 {a_{i+1}})
递推,AC
P6858 深海少女与胖头鱼
确实不难
题目分析
根据以往经验先看部分分,发现有 (m=0) 的情况
推!
我们设 (f_{i,j}) 表示现在有 (i) 条带圣盾的胖头鱼,(j) 条不带圣盾的胖头鱼
(m=0) 时我们随便打一下都会使一条胖头鱼失去圣盾,即 (f_{i,0}=f_{i-1,1}+1)
发现有 (m=1) 的情况在式子中出现,我们先不管
然后我们下一次有 (dfrac 1 {i-1}) 的几率打中没有圣盾的胖头鱼,即 (f_{i,0}=f_{i-1,0}+1+i-1+1=f_{i-1,0}+i+1)
然后我们来看一般情况,对于 (i) 条带圣盾的胖头鱼,(j) 条不带圣盾的胖头鱼,我们有 (dfrac{j}{i+j}) 的几率杀死一条胖头鱼,(dfrac{i}{i+j}) 的几率使一条胖头鱼失去圣盾,并且其他的胖头鱼带上圣盾,即
现在我们来推一下 (m=1) 的情况,由上 (f_{i,0} o f_{i-1,0}) 的推导过程可知:(f_{i-1,1}=f_{i-1,0}+i-1)
即 (f_{i,1}=f_{i,0}+i+1)
(f_{i,0}) 的通项公式显然是 (dfrac{n(n+3)}2)
递推一下上面的式子这题就做完了
CF16E Fish
一遍过祭,状压+概率,似乎挺神的,但是简单
题目分析
看一眼数据范围 (nle18),基本确定状压
对于相遇相杀的两条鱼,他们相遇的几率是剩余存活的鱼 (k) 中选两条的概率,即:(dbinom{k}{2})
然后相杀干掉对方的概率已经给出来了,设为 (m_{i,j})
我们设 (f_i) 表示一番操作后状态为 (i) 的概率,如果状态 (i) 的第 (j) 位为 (1),表示第 (j) 条鱼被干掉了
于是 (f_{i|2^j}=dfrac{m_{i,j}f_i}{k(k-1)/2}),其中 (|) 表示按位或
最后我们给 (2^n-1) 循环异或第 (i) 位输出答案即可
P6835 [Cnoi2020]线形生物
一遍过祭(虽然并不难)
题目分析
首先显然可以高斯消元,但是复杂度爆炸
根据高斯消元时我们设的未知数,容易想到期望的线性性质
为方便叙述,设 (f_{i,j}) 表示 (i o j) 的期望步数,(E_i) 表示点 (i) 的返祖边边集,(ein E_i) 表示返祖边的终点
显然有:
而在此题中期望的线性性质表现为:
所以我们化开上文中所提到的式子即有:
维护一个前缀和就得到了一个 (O(n)) 的做法
P6046 纯粹容器
题目分析
我们发现一个容器一定会被左右两边的,最近的,强度比它大的容器干掉
于是我们先处理一下它距离左右两边强度比它大的容器的距离
每次选择两个容器打破的过程就相当于选择并去掉一条边
一个容器被打破当且仅当它距离两边强度比它大的容器的路径上的边全部被选择
然后这就是一个组合数问题了,将每轮存活的几率累加起来即可
即每一轮有:
P6834 [Cnoi2020]梦原
水题
题目分析
根据题目不难有:
其中 (B) 表示能连接的父结点的个数
这个式子是 (O(n^2)) 的,考虑优化
第一个sigma是去不掉了,考虑第二个sigma
我们发现第二个sigma主要是用来统计比 (a_i) 小的数的和的
这个工作显然可以用BIT来完成,于是本题就 (O(nlg n)) 做完了
P3239 [HNOI2015]亚瑟王
我怎么这么傻,总是想不起来用期望的线性性...
题目分析
首先打出一张牌的概率是 (q_i),不打出的概率是 (1-q_i)
连续 (i) 轮都没有打出的概率是 ((1-q_i)^i),在连续 (i) 轮中打出的概率是 (1-(1-q_i)^i)
本题中如果打出了一张牌,那么本轮结束
看一下样例解释,发现对于每种情况都可以拆分
设现在这种状况打出的牌是 ({a_1,a_2,cdots,a_k}),几率是 (p)
拆分一下,对于每张牌分开算贡献,几率仍然按照 (p) 来计算
我们将所有情况的拆分按照牌的种类归到一起,将概率累加起来,那么本题期望的线性性就得到了体现
即:
其中 (p_i) 是所有情况下概率的和
我们发现 (p_1) 是很好计算的,但是之后的 (p_i) 因为“打出一张牌,本回合结束”这个限制而不能直接计算
设现在是第 (r) 轮,容易看出当前轮是否考虑第 (i) 张牌仅仅与前面轮次排在 (i) 前面的牌打出的张数有关
设 (f_{i,j}) 表示当前轮前 (i) 张牌打出了 (j) 张,尝试递推 (f_{i,j})
- 对于 (f_{i-1,j}),表示到当前轮次为止没有打出第 (i) 张牌,第 (i) 张前面的牌因为被打出了 (j) 张,所以第 (i) 张牌只被考虑了 (r-j) 轮,所以这个几率是 ((1-q_i)^{r-j}f_{i-1,j})
- 对于 (f_{i-1,j-1}) 表示到当前轮次为止打出了第 (i) 张牌,仿照上文,几率是 ((1-(1-q_i)^{r-(j-1)})f_{i-1,j-1})
综上所述,我们得到了一个关于 (f_{i,j}) 的递推式
现在我们再来考虑 (p_i)
不难发现如果要对答案做贡献,这一张牌是要打出的
而所有打出第 (i) 张牌的情况的概率和即是 (p_i)
我们已经推出了 (f_{i,j}),所以我们要做的就是将它们加起来
即:
求出了 (p_i),就可以递推 (E(x)) 了
复杂度 (O(nTr))
后记
本文像是一块凝固的时间
“差不多了,我们再踏上一段新的征程”