T1 不重复段
题目大意:给定长度为 n n n ( n ≤ 1 0 5 n\le10^5 n≤105 ) 的数列 a a a ( a i ≤ 1 0 6 a_i\le 10^6 ai≤106 )。有 q q q ( q ≤ 1 0 5 q\le 10^5 q≤105) 次询问,每次给定区间 [ l , r ] [l,r] [l,r] ,输出这段区间内最长的无重复数字的子串长度。
参照数列找不同一题的思路,先打出一个表 s s s ,表示对于给定的 l l l ,要使 [ l , r ] [l,r] [l,r] 无重复数字的最大 r r r 。如何实现详见上面的链接。
问题问的是给定区间 [ l , r ] [l,r] [l,r] ,输出这段区间内最长的无重复数字的子串长度。我们不放拿样例画个图,看看能发现什么(以第一个询问为例)。
然后,不难证明, s s s 数组是单调不下降的。而 l l l 又是递推 + 1 +1 +1 的,于是,对于 2 − s [ 2 ] 2 - s[2] 2−s[2] 这条线段和 3 − s [ 3 ] 3 - s[3] 3−s[3] 这条线段(如图),前者左端点比右者大,而且它们俩的右端点都超出了我们要求的区间 [ 1 , 3 ] [1,3] [1,3] ,于是我们只需要考虑 2 2 2 。同理,由于 s s s 数组的单调性, 2 2 2 之后的线段我们都不需要考虑。于是,我们可以采用二分查找,找到第一一个使得 q r ≤ s