Если честно, $ 2200 до $ заголовка не может сделать немного унизительно ......
Конечно, первое предложение все появляется такое же число раз.
Первая секция сортировки соответствует числу переключения двух смежных, в передней части числа, чтобы быть больше, чем число переключения обратно.
Тогда не будет ......
Мы считаем $ b_1 $ до $ b_ {я-1} $, были самонаводящиеся, а теперь хотят $ b_i $ самонаведения.
Найти свою позицию в $ A $ появляясь в следующем (до $ P $). Было установлено, что только тогда, когда $ A_P $ является $ a_i $ до $ A_p $ минимальное время, чтобы пойти.
Это не изменит положение $ A $ конкретного кода для достижения, как определить минимальное значение его? Было установлено, что номер был самонаведения на минимальный взнос не будет самонаведения после стать INF. Затем спросите $ 1 $ до $ P $ до минимума.
Временная сложность $ O (п \ п лог) $.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# include <бит / STDC ++ ч.> с использованием пространства имен STD; ЬурейеЕ долго долго LL; Const INT maxn = 300030 ; #define lson о << 1, л, средний #define rson о << 1 | 1, середина + 1, г #define ДЛЯ (я, а, б) для (INT I = (а); г <= (б ); я ++) #define ROF (я, а, б) для (INT I = (а); I> = (б); я--) #define MEM (х, у) MemSet (X, V, SizeOf ( х)) рядный INT чтения () { INT х = 0 , е = 0 ; символ ч = GetChar (); в то время как (ч < ' 0 '|| ч> ' 9 ' ) П | = ч == ' - ' , ч = GetChar (); в то время как (ч> = ' 0 ' && ч <= ' 9 ' ) х = х * 10 + CH- ' 0 ' , ч = GetChar (); вернуться п - х: х; } INT т, п, а [maxn], б [maxn], та [maxn], Т.Б. [maxn], млн [maxn * 4 ], LEN [maxn]; вектор < INT > в [maxn];1 ], млн [о << 1 | 1 ]); } Недействительными сборки ( INT о, INT л, INT г) { если (л == г) возвращение недействительными (млн [O] = а [L]); Int середине = (L + R) >> 1 ; построить (lson); построить (rson); Pushup (о); } Недействительным обновление ( INT о, INT л, INT г, INT р, INT v) { если (л == г) возвращение недействительными (млн [O] = v); ИНТсередина = (L + R) >> 1 ; если (середина> = р) обновление (lson, р, v); остальное обновление (rson, р, v); Pushup (о); } INT запроса ( INT о, INT л, INT г, INT QL, INT QR) { если (л> = QL && г <= дг) возвращение млн [о]; Int середине = (L + R) >> 1 , ANS = 2E9; если (середина> = QL) ANS = мин (ANS, запрос (lson, QL, Qr)); если (середина <дг) ANS = мин (ANS, запрос (rson, QL, Qr)); вернуться анс; } ИНТОсновной () { т = следующим образом (); в то время как (T-- ) { BOOL флаг = верно ; п = следующим образом (); ЗА (I, 1 , п) та [I] = A [I] = READ (), на [а [I]] push_back (I).; ЗА (I, 1 , п) туберкулез [I] = Ь [I] = следующим образом (); сортировки (тот + 1 , тот + п + 1 ); род (ТБ + 1 , Т.Б. + п + 1 ); ЗА (I, 1 , п) , если (та [I] = Т.Б. [я]!) {(Пут " НЕТ " ), флаг = ложь ; перерыв;} Если (! Флаг) { ЗА (я, 1 , п) при [I] .clear (), длина [I] = 0 ; продолжить ; } Построить ( 1 , 1 , N); ЗА (I, 1 , п) { INT р = у [Ь [I]] [Len [Ь [I]] ++ ]; если (запрос ( 1 , 1 , п, 1 !, р) = B [I]) {пут ( " НЕТ " ), флаг = ложь ; перерыв ;} обновление ( 1 , 1 , N, P, 2E9); } если (флаг) ставит ( " ДА " ); ЗА (I, 1 , п) в [I] .clear (), длина [I] = 0 ; } }