题意
一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。
题解
首先,一个很显然的做法就是
对于每一个位置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)+min(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)
容易发现,这东西就是启发式合并,因此复杂度也是nlognnlognnlogn的
无论从代码上还是从常数上都比第一个做法小得多