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;
}
 
posted @ 2020-06-05 15:28  SyrupWRLD  阅读(143)  评论(0)    收藏  举报