4.5 每日一题题解

Dreamoon Likes Permutations

涉及知识点:

  • 思维/暴力

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;
}
posted @ 2020-04-05 09:11  QFNU-ACM  阅读(153)  评论(0编辑  收藏  举报