Note 5.26-5.28

Luogu5303 [GXOI/GZOI2019]逼死强迫症

(f(i)=f(i-1)+f(i-2),f(0)=f(1)=1),即是(2 imes i)的铺放方案数;再考虑两块碎砖的距离,有(Ans=2 imes sum_{i=3}^{n} sum_{j=0}^{n-i} f(j) imes f(n-i-j));设(g(n)=sum_{i=0}^{n} f(i) imes f(n-i)),展开有(g(n)=g(n-1)+g(n-2)+f(n-1)+f(n-2));那么矩阵快速幂即可。

Luogu4495 [HAOI2018]奇怪的背包

假设选择了物品(t_1,t_2,...,t_k),那么(sum_{i=1}^{k} a_i V_{t_i} equiv w pmod P),不难发现在模(P)意义下,a_i的取值范围相当于(R),所以有(gcd(V_{t_1},V_{t_2},...,V{t_k},P)|w),即:(GCD_{i=1}^{k} gcd(V_{t_i},P)|w),考虑dp,设(f(i,j))表示考虑到与(P)公约数为(i)的一组数,现在的总约数为(j)的方案数,转移即可。对于一个(w),其答案就是$sum_{d|w} f(..,d) $,是可以预处理的。

Luogu5300 [GXOI/GZOI2019]与或和

拆位,问题就变成了对于一个01矩阵,求它的全1子矩阵个数,处理出每个点的最高高度,单调栈统计即可,最后乘上答案即可。

Luogu4606 [SDOI2018]战略游戏

首先建圆方树。发现要摧毁的点是割点,割点满足什么条件呢,观察到它一定是(u)(v)在圆方树上的简单路径上的圆点(不包括端点)。那么多个点怎么统计呢?用树链的并统计圆点个数即可,注意最后要减去不能摧毁的(|S|)个点。

Luogu5330 [SNOI2019]数论

考虑在模(B)剩余系下计算贡献,不难发现对于加A成(gcd(A,B))环,在环上的贡献可以(O(1))递推,大致分类讨论一下即可,所以最后可以(O(n))的算出所有模B剩余系下的点的贡献。

Luogu5323 5323 [BJOI2019]光线

(f(i))表示第(i)层玻璃上部进光量,(g(i))表示第(i)层玻璃下部进光量,有(a_if(i)+b_ig(i)=f(i+1))(a_ig(i)+b_if(i)=g(i-1))(f(1)=1)(g(n)=0),从上到下依次消元即可。

Luogu5327 [ZJOI2019]语言

考虑对于每个点分别计算贡献,那么(u)所能匹配的点数就是经过它的路径的并。如何统计所有点的答案呢?采用(dfs)序线段树维护树链的并,就可以做到动态插入删除路径,对于路径的插入删除,考虑用树上差分打标记实现,那么一个点对应的线段树就由子树继承而来,套上线段树合并即可。

Luogu5280 [ZJOI2019]线段树

(f(x))表示节点(x)有标记的线段树占总数比例,(g(x))表示节点(x)到根路径有标记的线段树占总数比例,那么每一次修改就是:
1.到达目标节点前经过的节点:(f(x)=frac{f(x)}{2})(g(x)=frac{g(x)}{2})
2.目标节点:(f(x)=frac{1}{2}+frac{f(x)}{2})(g(x)=frac{1}{2}+frac{g(x)}{2})
3.目标节点子树内的节点:(f(x)=f(x),g(x)=frac{1}{2}+frac{g(x)}{2})
4.PushDown但未经过的节点:(f(x)=frac{f(x)}{2}+frac{g(x)}{2})(g(x)=g(x))
5.其他节点不变。
具体修改用懒标记实现即可,答案就是(NUM imes sum_{i=1}^{tree_tot} f(i))

Luogu2481 [SDOI2010]代码拍卖会

发现对于一个数,一定可以表示为(sum_{i=1}^{t} frac{10^{k_i}-1}{9}(t leq 9))。而(frac{10^{k_i}-1}{9})这样的数模(P)是有周期的,长度(O(P)),直接考虑dp。设(f(i,j,k))表示考虑到余数为(i)的一组数时,已经选了(j)个数,当前余数为(k)的方案数,每一次转移枚举再选(x)个数即可,贡献是({cnt[i]+x-1,x-1})。最后注意第一个数不能为(0)

Luogu4492 [HAOI2018]苹果树

发现长出第(i)个节点时有(i)种选择,所以最后总形态数就是(N!),所以就是求所有树的不便度之和。考虑对于每条边计算对总答案的贡献,若子树大小为(j),贡献即为(j(n-j))。那么一共计算了多少次呢?设当前子树根节点为第(i)个节点,那么前(i)个节点的形态有(i!)种,子树内部形态有(j!)中,剩下的(n-i-j+1)个节点的形态有(prod_{k=i-1}^{n-j-1} k)种,然后子树内的节点编号有({n-i choose j})种,所以总贡献是(j(n-j)i!j!{n-i choose j}prod_{k=i-1}^{n-j-1}k),即(ij(n-j)!j!{n-i choose j})。最后枚举(i)(j)求和即可。

Luogu4916 魔力环

link

LOJ6502「雅礼集训 2018 Day4」Divide

考虑重新构造数列,使对于数列中的每一个(i),都有(w[i]+w[j] geq m或w[i]+w[j] lt m(1 leq j lt i))成立,那么就可以方便地用dp转移求得答案。现在考虑如何构造数列,先按(w)的大小排序,发现对于区间([l,r]),若(w[l]+w[r] leq m)成立,那么(w[t]+w[r] leq m)恒成立;若(w[l]+w[r] gt m)成立,那么(w[l]+w[t] gt m)恒成立;那么从([1,n])开始,每一次取出相应的(w[l])(w[r]),就可以得到满足条件的数列。

LOJ6503「雅礼集训 2018 Day4」Magic

直接算不好算,考虑给所有卡片编号,最后答案再除以(prod_{i=1}^{m} a_i!)即可。那么(k)个魔术队相当于在(n)张牌中选出(k)张牌,再将其插入到其他颜色与其相同的牌后。那么我们无法保证其他牌不形成魔术对,所以考虑容斥。设(f(k))表示恰好(k)张牌形成魔术对的方案数,(g(k))表示至少(k)张牌形成魔术对的方案数。那么有:(f(k)=sum_{i=k}^{n-1} (-1)^{i-k} {i choose k}g(i))。如何计算(g(i))呢?考虑dp。设(f(i,j))表示考虑到第(i)种颜色,之前已经选出了(j)张牌构成魔术对,转移就枚举在第(i)种颜色中选出(x)张牌。贡献是多少呢?就是选出(x)({a_i choose x}),再将(x)张牌插入到其他牌后面(prod_{j=a_i-x}^{a_i-1}j),所以是({a_i choose x}prod_{j=a_i-x}^{a_i-1}j)。最后因为其他牌未计入顺序,所以(g(i)=f(m,i) imes (n-i)!)。但是这样复杂度没有保证,因为每一次的转移实际是(F_{i-1}(x))与贡献函数(W_i(x))卷积得到新的(F_i(x)),所以可以用多项式优化。注意这里要用堆维护当前所有多项式的长度,每一次选出最短的两个做卷积即可,复杂度相当于分治,是(O(nlog^{2}n))

原文地址:https://www.cnblogs.com/pkh68/p/10940509.html