zoukankan      html  css  js  c++  java
  • 数据结构+插头dp+多项式 题解乱写

    可持久化数据结构
    A.森林
    树上的数据结构常可以启发式合并,
    用启发式合并的思路合并树上主席树就可以了。
     
    B.影魔
    一个常见的这种数据结构题的套路是:
    离线询问,按右端点排序。
    在右指针扫过去的同时在数据结构(常为线段树)中更新该右端点能产生的答案。
    同时在数据结构中查询统计右端点对应的区间就好了。
     
    C.世博会
    对于很多个点对((x,y)),((X,Y))要求(max(|X-x|,|Y-y|))
    这个玩意并不能简单地用数据结构维护。
    然后发现这个玩意是切比雪夫距离。
    对于点对的曼哈顿距离(|X-x|+|Y-y|)
    不妨将((x,y))转化为((x+y,x-y)),然后发现曼哈顿距离转化为了切比雪夫距离。
    也就是说可以通过反向的转化((x,y) ightarrow(frac{x+y}{2},frac{x-y}{2}))
    然后问题转化为了易于维护的的曼哈顿距离,在本题中找中位数就好了。
     
     
     
    插头dp
    A.游览计划
    网格图上的最小生成树(斯坦纳树)。
    一种较为简单的做法是状压,(dp_{x,S})表示点(x),联通的点集为(S)的最小代价(通过spfa实现)。
    转移考虑两种情况:
    1.拓展到相邻的格子,即仍然维护原树的一条链状结构。
    2.合并两种状态(枚举与(S)无交集的集合(T),将(dp_{x,s})(dp_{x,T})合并为(dp_{x,S|T})),即将两条链(实际上是树)合并。
     
     
     
    多项式
    A.Normal
    期望的一种转化形式,与下面两个式子的转化很类似。
    (E(x)=sum limits_{i=0}^{+infty}i*p(x==i))
    (E(x)=sum limits_{i=0}^{+infty}p(x>=i))
    考虑将每个节点的期望深度,转化为其他的节点成为它祖先的概率和。
    点对((i,j)),如果(j)成为(i)的祖先,一定满足((i,j))链上没有节点被选。
    所以这个概率即(frac{1}{dis(i,j)}),用点分治统计出所有点对的概率和就好了。
     
    B.序列统计
    将取模意义下转移并不连续,形式不优美的原值。
    转化为原根的(k)次方所表示的数,于是可以用循环矩阵优化,于是可以套上NTT作快速幂(或是多项式exp)。
     
    C.染色
    看到恰好形式,考虑二项式反演。
    题意中出现了两个恰好,但是发现有一个恰好是容易保证的,即钦定颜色的出现次数。
    所以对多少个颜色恰好出现(k)次进行二项式反演就好了。
     
    D.城市规划
    (f_i)表示(i)个点的符合条件的联通图,(g_i)表示(i)个点的任意图。
    钦定最后一个联通块大小,钦定一个点在最后一个联通块(这点很关键),就可以直接通过补集容斥求出(f_i)了。
    暴力的做法是分治FFT,化一化式子可以发现可以做多项式求逆。
    然而还可以直接用EGF搞这个题。
    (F(x)=sum limits_{i=0}^{infty}frac{f_i*x^i}{i!})为有标号联通图的EGF。
    (G(x)=sum limits_{i=0}^{infty}frac{g_i*x^i}{i!})为有标号任意图的EGF。
    枚举任意图划分为几个联通块,则有(G(x)=sum limits_{i=0}^{infty}frac{F^i(x)}{i!})
    因为原本是有标号的,乘上可重排列数后仍是有标号的。
    因为多项式乘法作的是排列,所以要除掉(i!)
    可得(G(x)=e^{F(x)}),即(F(x)=ln(G(x)))
     
    E.按位或
    考虑(minmax)容斥。
    用每个集合中最早出现的1的期望,容斥出最晚出现的1,也就是全部变成1的期望。
    (E=frac{1}{p}),所以只要求出与每个集合的每一位1集合有交的概率和。
    将这个玩意转化为与集合无交,就是简单的子集求和了。
     
    F.遗忘的集合
    要求我们通过背包得到的(dp)数组,反推回保证体积各不相同的物品体积。
    推一下(OGF)的式子。
    优化01背包:
    设容量为(i)的物品有(a_i)个,在本题中仅有0/1两种取值。
    (F(x))表示答案的生成函数。
    那么有(F(x)=prod limits_{i=1}^{n}(1+x^i)^{a_i})
    (=exp(ln(prod limits_{i=1}^{n}(1+x^i)^{a_i})))
    (=exp(sum limits_{i=1}^{n}a_iln(1+x^i)))
    (=exp(sum limits_{i=1}^{n}a_isum limits_{j=1}^{infty}frac{(-1)^{j-1}(x^i)^j}{j}))
    优化完全背包:
    设容量为(i)的物品有(a_i)个,在本题中仅有0/1两种取值。
    (F(x))表示答案的生成函数。
    那么有(F(x)=prod limits_{i=1}^{n}(frac{1}{1-x^i})^{a_i})
    (=exp(ln(prod limits_{i=1}^{n}(frac{1}{1-x^i})^{a_i})))
    (=exp(sum limits_{i=1}^{n}a_iln(frac{1}{1-x^i})))
    (=exp(sum limits_{i=1}^na_isum limits_{j=1}^{infty}frac{(x^i)^j}{j}))
    这个时候发现已经可以(O(nlnn))求出exp里面的式子,做个多项式exp就好了。
    在本题中我们有了(F(x)),两边同时求(ln),可得(sum limits_{i=1}^na_isum limits_{j=1}^{infty}frac{(x^i)^j}{j})
    对每一项的系数作莫比乌斯反演,即可得到(a_i)的取值。
     
    G.猎人杀
    一个结论是,不考虑已经死掉的猎人,一直射下去直到射死活着的猎人,不影响最终的获胜者。
    之后只要容斥就好了,设(f_S)表示至少集合(S)中的猎人在(1)号猎人后面死。
    (S)中元素的权值和为(s),全集的权值和为(W)
    (f_S=sum limits_{i=0}^{infty}(frac{W-s-w_1}{W})^ifrac{w_1}{W})
    (ans=sum limits_{S}(-1)^{|S|}f_S)
    (f_S=sum limits_{i=0}^{infty}(frac{W-s-w_1}{W})^ifrac{w_1}{W})
    (=sum limits_{i=0}^{infty}(1-frac{s+w_1}{W})^ifrac{w_1}{W})
    (=frac{1}{frac{s+w_1}{W}}frac{w_1}{W})
    (=frac{w_1}{s+w_1})
    所以只要通过01背包预处理出对于每个(s)的容斥系数,之后一次性统计就好了。
    因为题中保证了(W)并不大,所以本题直接分治/启发式合并就可以做到(O(nlog^2n))
    用上面的套路exp优化背包,可以做到(O(nlogn)),然而实测跑不过分治,哭了。

  • 相关阅读:
    阿里妈妈又做了新工具,帮你把 Vue2 代码改成 Vue3 的
    gulp安装出错
    js操作select
    linux基本命令说明参数
    Linux基础——vim编辑器的使用
    常见报错——Uncaught TypeError: document.getElementsByClassName(...).addEventListener is not a function
    IE浏览器hack方法总结之条件注释判断
    浏览器兼容
    安好
    jQuery调整表列(左右拉动调整列宽)插件__colResizable,动态列如何使用
  • 原文地址:https://www.cnblogs.com/skyh/p/12114325.html
Copyright © 2011-2022 走看看