数据结构+插头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)\rightarrow(\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_i\sum \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_i\sum \limits_{j=1}^{\infty}\frac{(x^i)^j}{j})\)
这个时候发现已经可以\(O(nlnn)\)求出exp里面的式子,做个多项式exp就好了。
在本题中我们有了\(F(x)\),两边同时求\(ln\),可得\(\sum \limits_{i=1}^na_i\sum \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})^i\frac{w_1}{W}\)
\(ans=\sum \limits_{S}(-1)^{|S|}f_S\)
\(f_S=\sum \limits_{i=0}^{\infty}(\frac{W-s-w_1}{W})^i\frac{w_1}{W}\)
\(=\sum \limits_{i=0}^{\infty}(1-\frac{s+w_1}{W})^i\frac{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)\),然而实测跑不过分治,哭了。