题意
Lyra 最近刚刚得到由小写字母构成的长度为 nnn 的字符串 sss,下标为 [1,n][1,n][1,n]。 Evan 觉得传统的字符串询问 Lyra 都能轻松解决,于是给出了 mmm 个复杂的询问,每个询问包含五个参数 X,A,B,L,RX,A,B,L,RX,A,B,L,R,你需要找出原字符串的一个子串 t=s[i,j]t = s_{[i,j]}t=s[i,j],满足 ttt 在 [L,R][L,R][L,R] 区间内,长度在 [A,B][A,B][A,B] 区间内,包含恰好 XXX 种不同的字符。如果有这样多个 i,ji,ji,j,输出 iii 最小的那个,若仍有多个 jjj 满足条件,选择最小的 jjj,无解输出 −1,−1−1,−1−1,−1。
对于全部数据, 1≤n,m≤105,1≤L≤R≤n,1≤A≤B≤n,1≤X≤261 \le n, m \le 10^5, 1 \le L \le R \le n, 1 \le A \le B \le n, 1 \le X \le 261≤n,m≤105,1≤L≤R≤n,1≤A≤B≤n,1≤X≤26
Subtask 1[6pts] n≤100n \le 100n≤100
Subtask 2[9pts] n≤1000n \le 1000n≤1000
Subtask 3[17pts] A=1,B=nA = 1,B = nA=1,B=n
Subtask 4[17pts] L=1,R=nL = 1, R = nL=1,R=n
Subtask 5[17pts] 所有询问的 XXX 都相等.
Subtask 6[34pts] 没有特殊限制
题解
思路比较清晰的一道数据结构题,原本想的方向也是对的,但以为限制有很多不可做,没有好好分析导致自闭。
首先对于每种xxx分开做,显然每个起点到达的终点是一段连续区间(容易预处理)。
设每个点为(p,x,y)(p,x,y)(p,x,y)表示起点在ppp,终点在[x,y][x,y][x,y],发现x,yx,yx,y是随ppp不降的。
于是对于每个询问(a,b,l,r)(a,b,l,r)(a,b,l,r),相当于要求最小的ppp,使得max(p+a−1,x)≤min(y,r,p+b−1)max(p+a-1,x) \le min(y,r,p+b-1)max(p+a−1,x)≤min(y,r,p+b−1)且l≤pl\le pl≤p。
拆开后简化一下就是求x−p+1<=bx-p+1<=bx−p+1<=b,y−p+1>=ay-p+1>=ay−p+1>=a,p≤x≤rp\le x\le rp≤x≤r的最小ppp。
对于p≤x≤rp\le x\le rp≤x≤r可以利用(p,x,y)(p,x,y)(p,x,y)的单调性二分得出ppp的区间(L,R)(L,R)(L,R),于是将询问按照bbb升序,每个询问求区间内a≤y−p+1a\le y-p+1a≤y−p+1的最小的ppp,用线段树单点修改+区间二分即可维护。
原本还不太会证区间二分的效率,对于询问(a,b,x)(a,b,x)(a,b,x),可以把[a,b][a,b][a,b]分为logloglog个区间,只会在第一个有≥x\ge x≥x的区间二分下去并且找到,所以效率就是一个logloglog了。