6.5 VJ B - Dreamoon Likes Permutations
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
/*
*/
const ll N=2e5+5;
ll a[N],n;
bool c[N],d[N];
map<ll,ll>b;
int main()
{
speed_up;
int t;
cin>>t;
while(t--){
ll maxx=0,num=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
b.clear();
//从前往后判断
for(int i=0;i<n;i++){
maxx=max(maxx,a[i]);//找出0~i这段中的最大值
if(b[a[i]]){
continue;
}
if(a[i]<=maxx){
num++;//出现过的数有几种
b[a[i]]=1;//标记出现过的数
}
//这一段的长度应该等于这段的最大值
if(num==maxx&&num==i+1){//判断是否有缺少或有重复的数
c[i]=1;//前一段包含了1~maxx中所有的数,记录下标,还需要判断后一段是否可行
}
}
num=0;
maxx=0;
b.clear();
//从后往前判断
for(int i=n-1;i>0;i--){
maxx=max(maxx,a[i]);
if(b[a[i]]){
continue;
}
if(a[i]<=maxx){
num++;
b[a[i]]=1;
}
if(num==maxx&&num==n-i){
d[i]=1;
}
}
ll sum=0;
for(int i=0;i<n-1;i++){//判断前后两段是否都符合
if(c[i]==1&&d[i+1]==1){
sum++;
}
}
cout<<sum<<endl;
for(int i=0;i<n-1;i++){
if(c[i]==1&&d[i+1]==1){
cout<<i+1<<" "<<n-i-1<<endl;
}
}
for(int i=0;i<n;i++){
c[i]=0;
d[i]=0;
}
}
return 0;
}
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
/*
*/
const ll N=2e5+5;
ll a[N],n;
bool c[N],d[N];
map<ll,ll>b;
int main()
{
speed_up;
int t;
cin>>t;
while(t--){
ll maxx=0,num=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
b.clear();
//从前往后判断
for(int i=0;i<n;i++){
maxx=max(maxx,a[i]);//找出0~i这段中的最大值
if(b[a[i]]){
continue;
}
if(a[i]<=maxx){
num++;//出现过的数有几种
b[a[i]]=1;//标记出现过的数
}
//这一段的长度应该等于这段的最大值
if(num==maxx&&num==i+1){//判断是否有缺少或有重复的数
c[i]=1;//前一段包含了1~maxx中所有的数,记录下标,还需要判断后一段是否可行
}
}
num=0;
maxx=0;
b.clear();
//从后往前判断
for(int i=n-1;i>0;i--){
maxx=max(maxx,a[i]);
if(b[a[i]]){
continue;
}
if(a[i]<=maxx){
num++;
b[a[i]]=1;
}
if(num==maxx&&num==n-i){
d[i]=1;
}
}
ll sum=0;
for(int i=0;i<n-1;i++){//判断前后两段是否都符合
if(c[i]==1&&d[i+1]==1){
sum++;
}
}
cout<<sum<<endl;
for(int i=0;i<n-1;i++){
if(c[i]==1&&d[i+1]==1){
cout<<i+1<<" "<<n-i-1<<endl;
}
}
for(int i=0;i<n;i++){
c[i]=0;
d[i]=0;
}
}
return 0;
}

浙公网安备 33010602011771号