題意
Lyra 最近剛剛得到由小寫字母構成的長度爲 n 的字符串 s,下標爲 [1,n]。 Evan 覺得傳統的字符串詢問 Lyra 都能輕鬆解決,於是給出了 m 個複雜的詢問,每個詢問包含五個參數 X,A,B,L,R,你需要找出原字符串的一個子串 t=s[i,j],滿足 t 在 [L,R] 區間內,長度在 [A,B] 區間內,包含恰好 X 種不同的字符。如果有這樣多個 i,j,輸出 i 最小的那個,若仍有多個 j 滿足條件,選擇最小的 j,無解輸出 −1,−1。
對於全部數據, 1≤n,m≤105,1≤L≤R≤n,1≤A≤B≤n,1≤X≤26
Subtask 1[6pts] n≤100
Subtask 2[9pts] n≤1000
Subtask 3[17pts] A=1,B=n
Subtask 4[17pts] L=1,R=n
Subtask 5[17pts] 所有詢問的 X 都相等.
Subtask 6[34pts] 沒有特殊限制
題解
思路比較清晰的一道數據結構題,原本想的方向也是對的,但以爲限制有很多不可做,沒有好好分析導致自閉。
首先對於每種x分開做,顯然每個起點到達的終點是一段連續區間(容易預處理)。
設每個點爲(p,x,y)表示起點在p,終點在[x,y],發現x,y是隨p不降的。
於是對於每個詢問(a,b,l,r),相當於要求最小的p,使得max(p+a−1,x)≤min(y,r,p+b−1)且l≤p。
拆開後簡化一下就是求x−p+1<=b,y−p+1>=a,p≤x≤r的最小p。
對於p≤x≤r可以利用(p,x,y)的單調性二分得出p的區間(L,R),於是將詢問按照b升序,每個詢問求區間內a≤y−p+1的最小的p,用線段樹單點修改+區間二分即可維護。
原本還不太會證區間二分的效率,對於詢問(a,b,x),可以把[a,b]分爲log個區間,只會在第一個有≥x的區間二分下去並且找到,所以效率就是一個log了。