zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    python运算符
    CocoChina开发者大会
    iphone模拟器上不能安装从itunes下载的app
    Objective-C学习--源文件结构
    Objective-C学习笔记--复合
    Objective-C学习笔记--继承
    Objective-C学习笔记--实例化对象
    Objective-C学习笔记--@implementation
    Objective-C学习笔记--@interface
    C语言函数原型
  • 原文地址:https://www.cnblogs.com/pkh68/p/10940509.html
Copyright © 2011-2022 走看看