题意
一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。
题解
首先,一个很显然的做法就是
对于每一个位置i,我们可以知道他作为独一无二的值的区间有什么
这个预处理上一个,下一个和他一样的就可以了
然后就相当于这一段区间都是合法的
如果[l,r]看作一个点,明显地,他可以覆盖一个矩形
那么就变成矩形面积并了
看一下是否覆盖所有合法区间即可
但是这样做这题就太没有意思了。。
于是就有一个很好玩的做法
就是对于一个区间
[
l
,
r
]
[l,r]
[l,r]
如果他的一个位置p,是独一无二的,那么我们显然可以递归
[
l
,
p
−
1
]
,
[
p
+
1
,
r
]
[l,p-1],[p+1,r]
[l,p−1],[p+1,r]
至于p怎么找,你可以从序列的两头扫两个指针
如果有一个符合就结束递归
复杂度的话,你会发现,形式是这样的
T
(
n
)
=
T
(
k
)
+
T
(
n
−
k
)
+
m
i
n
(
k
,
n
−
k
)
T(n)=T(k)+T(n-k)+min(k,n-k)
T(n)=T(k)+T(n−k)+min(k,n−k)
容易发现,这东西就是启发式合并,因此复杂度也是
n
l
o
g
n
nlogn
nlogn的
无论从代码上还是从常数上都比第一个做法小得多