#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<cstring>
#include<set>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5 + 7;
void solve() {
/*
*求mex
while(cnt[mex]){
mex++;
}
*/
//题意:给你一个序列,问能否把他分成多段,使得每一段的MEX相等
//如果能分成多段 那么一定能分成两段
//所以 维护MEX(1,K) MEX(K+1,n)
//cntL表示前段 cntR表示后段 出现数字的个数
//for int i = 1 i <= n i ++
//先来看怎么求mexl
int n; cin >> n;
vector<int>a(n + 1);
vector<int>cntL(n + 1), cntR(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
cntR[a[i]]++;
}
int mexl = 0, mexr = 0;
while (cntR[mexr]) {
mexr++;
}
for (int i = 1; i <= n; i++) {
cntL[a[i]]++;
cntR[a[i]]--;
//很简单的一个道理 [0 1 2 3]->[0 1 3] mex=2
//而mex[0 1 2 4] mex=3 ->[0 1 2] mex=3
if (cntR[a[i]] == 0 && mexr > a[i]) {
mexr = a[i];
}
//求mexl
//很明显mexl只会增大,因为数字是增多的
//例如[0 1 3]mexl=2 下一回合[0 1 3 2]cntL[2]!=1 cntL++ cntL[3]!=1 mexl=4
while (cntL[mexl]) {
mexl++;
}
//其实这种方式可以求mexr 但必须初始化mexr=0 因为mexr可能减小的
//例如[0 1 2]mex=3 下一回合[1 2] 所以mexr必须初始化为0
/*mexr = 0;
while (cntR[mexr]) {
mexr++;
}*/
if (mexl == mexr) {
cout << 2 << endl;
cout << 1 << ' ' << i << endl;
cout << i + 1 << ' ' << n << endl;
return;
}
}cout << -1 << endl;
}
signed main() {
ios::sync_with_stdio(0);
int t; cin >> t;while(t--)
solve();
}
codeforces 932B:Informatics in MAC
最新推荐文章于 2024-08-22 21:24:01 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)