一个好用的工具——析合树
oi-wiki
例题
CF526F
题意:
给出一个1~nnn的排列,问有多少个区间的值域是连续的。
题解:
线段树+单调栈做法
分治做法
析合树做法
图论做法
CF997E
题意:
给出一个1~nnn的排列,有qqq次询问,每次问[l,r][l,r][l,r]内,有多少个区间的值域是连续的?
题解:
单调栈+线段树的扫描线做法
析合树离线做法
析合树在线做法
LuoguP4747
题意:
给出一个1~nnn的排列,有qqq次询问,每次问包含位置区间[l,r][l,r][l,r]的连续段的最短长度是多少,连续段的定义为排序后值域连续,可以证明解存在且唯一。
题解:
扫描线做法
析合树做法
图论做法:题解1 题解2
XSY3344
emm,这题原题好像是2018EC Final B.Mysterious … Host
这里有简要题解
题意:
题解:
所有nnn阶排列形成的等价类个数 等于 有nnn个叶子的不同形态的析合树棵树。
析合树有以下性质:
- 合点的儿子个数≥2\geq2≥2(叶子节点除外)
- 析点的儿子个数≥4\geq4≥4
设fif_ifi为所有iii阶排列形成的等价类个数(即有iii个叶子的不同形态的析合树棵树)。
显然可以O(n2)O(n^2)O(n2)DP得到fnf_nfn。
多项式优化:
记F(x)=∑i≥0fixiF(x)=\sum_{i\geq0}f_ix^iF(x)=∑i≥0fixi,那么有
F(x)=(F2(x)+F3(X)+F4(x)+...)+(F4(x)+F5(X)+F6(x)+...)+xF(x)=(F^2(x)+F^3(X)+F^4(x)+...)+(F^4(x)+F^5(X)+F^6(x)+...)+xF(x)=(F2(x)+F3(X)+F4(x)+...)+(F4(x)+F5(X)+F6(x)+...)+x
F(x)=(F2(x)+F4(x))(1+F(x)+F2(X)+F3(x)+...)+xF(x)=(F^2(x)+F^4(x))(1+F(x)+F^2(X)+F^3(x)+...)+xF(x)=(F2(x)+F4(x))(1+F(x)+F2(X)+F3(x)+...)+x
F(x)=F2(x)+F4(x)1−F(x)+xF(x)=\frac{F^2(x)+F^4(x)}{1-F(x)}+xF(x)=1−F(x)F2(x)+F4(x)+x
参考——两个学长的BlogBlogBlog:
https://www.cnblogs.com/ywwyww/p/10193748.html
https://blog.csdn.net/Mys_C_K/article/details/85385019
附:析合树形态计数 dp