B - Dreamoon Likes Permutations 思维搜索区间

题目链接

题意:

给你n个数,让你找到是否存在一种组合方式, 将这个数组分成两部分。这两部分都是从1开始的公差为1的等差数列。

思路:

用b[i]记录该数是否出现过,c[i]记录到该下标处的地址是合法的,vectort >存储坐标。

#include
using namespace std;
int b[200005], c[200005], a[200005];
int main()
{
     
    int t;
    cin >> t;
    vector<pair<int, int> >v;
    while(t--)
    {
     
        int n;
        cin >> n;
        v.clear();
        for(int i = 1; i <= n; i++)
        {
     
            c[i] = 0;
            b[i] = 0;
        }
        for(int i = 1; i <= n; i++)
        {
     
            cin >> a[i];
        }
        int l = n + 1, r = 0;
        for(int i = 1; i <= n; i++)
        {
     
            if(b[a[i]] == 1)break;
            l = min(l, a[i]);
            r = max(r, a[i]);
            if(l == 1 && r == i)c[i] = 1;
            b[a[i]] = 1;
        }
        for(int i = 1;i <= n;i++)b[i] = 0;
        l = n + 1, r = 0;
        for(int i = n;i >= 1;i--)
        {
     
            if(b[a[i]] == 1)break;
            l = min(l, a[i]);
            r = max(r, a[i]);
            if(l == 1 && r == n - i + 1 && c[i - 1] == 1)v.push_back({
     i - 1, n - i + 1});
            b[a[i]] = 1;
        }
        cout << v.size() << endl;
        for(pair<int, int> T: v)
        {
     
            cout << T.first << " " << T.second << endl;
        }

    }
    return 0;
}

你可能感兴趣的:(B - Dreamoon Likes Permutations 思维搜索区间)