可持久化数据结构
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)),然而实测跑不过分治,哭了。