涉及知识点:
solution:
- 正解不唯一,讲个容易理解的做法
- 找到长度为n的数组最大值记为m,那么符合条件的答案最多只有两个,即[1,m]区间,[m+1,n]区间 或者 [1,n-m]区间,[n-m+1,n]区间
- 所以我们可以枚举两种可能的答案,用map或者set存储一下,记录哪种方法可行
- 但是这个做法会被一个样例卡住,1 2 3 3 2 1
- 这样会输出两个3 3 ,所以需要特判一波
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 5;
int n, a[maxn];
vector<int> ans;
map<int ,int > mp1,mp2;
void solve(int l1, int l2)
{
mp1.clear() , mp2.clear();
int flag = 0;
for(int i=1;i<=l1;i++)mp1[a[i]]++;
for(int i=l1+1;i<=n;i++)mp2[a[i]]++;
for(int i=1;i<=l1;i++)
if(mp1[i] != 1)
flag = 1;
for(int i=1;i<=l2;i++)
if(mp2[i] != 1)
flag = 1;
if(flag == 0)
ans.push_back(l1);
}
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
int maxx = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
maxx = max(maxx , a[i]);
}
ans.clear();
solve(maxx , n - maxx);
solve(n - maxx , maxx);
if(ans.size() == 2){// 1 2 3 3 2 1
if(ans[0] != ans[1]){
cout<<2<<endl;
for(int i=0;i<2;i++){
cout<<ans[i]<<" "<<n-ans[i]<<endl;
}
}else{
cout<<1<<endl;
cout<<ans[0]<<" "<<n-ans[0]<<endl;
}
continue ;
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<" "<<n-ans[i]<<endl;
}
}
return 0;
}