大意:一棵
F
a
c
t
o
r
F
r
e
e
T
r
e
e
FactorFreeTree
FactorFreeTree树,满足对于每个点它的所有祖先都与他互质。现在给你一个序列,问你是否有一棵树,满足它的中序遍历是给出的序列,并且它是一棵
F
a
c
t
o
r
F
r
e
e
T
r
e
e
FactorFreeTree
FactorFreeTree。
给出中序遍历,让我们建树,显然可以采取分治的策略。每次在一段区间里选一个点
x
x
x做根,然后把这段区间分为
[
l
,
x
−
1
]
[l,x-1]
[l,x−1]和
[
x
+
1
,
r
]
[x+1,r]
[x+1,r]两段区间。继续分治下去即可。
但这道题有互质的限制。一个点能当根,那么它的子树里的点必然都与它互质。那么转化到区间里,就是
[
l
,
r
]
[l,r]
[l,r]区间里的所有点都与它互质。
如果预处理出
L
[
x
]
L[x]
L[x]和
R
[
x
]
R[x]
R[x]表示
x
x
x左边(和右边)第一个和它不互质的数的位置,那么只要满足
L
[
x
]
<
=
l
&
&
R
[
x
]
>
=
r
L[x]<=l\&\&R[x]>=r
L[x]<=l&&R[x]>=r,
x
x
x就可以作为区间的根。
但是普通的分治会被卡,因为这种题普通的分治上界是
O
(
n
2
)
O(n^2)
O(n2)的。所以我们又用启发式分裂,也就是从左右两端向中间推进。这样可以保证复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。