打了最近的cf之后 , 对这一道题有了新启发。
重点就是b数组的构建 ,这里的b数组的值表示的是a数组每一位从右往左第一次出现与该位不同的数的下标;当然从右往左构建也是可以的,不过那样就给再写一个循环了,多余一些。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std ;
const int N = 1e6 + 10 ;
int a[N];
int b[N];
int T ;
int n , q;
int l ,r ;
int main(){
cin >> T ;
while( T--){
cin >> n ;
for( int i = 1 ; i<= n ; ++ i){
cin >> a[i];
if(i == 1) b[i] = i -1;
else{
if(a[i] != a[i - 1] ) b[i] = b[ i -1 ] ;
else b [i] = i - 1 ;
}
}
cin >> q;
while(q--){
cin >> l >> r;
if(b[l] == b[r]){
cout << "-1 -1"<<endl;
}else{
cout << b[r] <<" "<<r<<endl ;
}
}
}
}