一个数字的下一个数如果作为mex
出现,意味着这个数字前面的数字一定都出现过.
我从枚举每个数的位置,维护枚举过的数字的最右端点和最左端点,如果枚举到的位置不在这两个端点之间,那么这个数一定只能放在原来的位置,否则这个数字可以放在这两个端点之间的任何位置.
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 5, mod = 1e9 + 7;
int a[maxn], pos[maxn];
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int T;
cin >> T;
while(T--){
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i], a[i]++, pos[a[i]] = i;
LL res = 1;
int maxv = 0, minv = n + 1;
for(int i = 1; i <= n; i++){
if (pos[i] < maxv && pos[i] > minv)
res = res * (maxv - minv + 1 - (i - 1)) % mod;
maxv = max(maxv, pos[i]);
minv = min(minv, pos[i]);
}
cout << res << '\n';
}
}