题意:
给定n个数 范围[1,n-1] 让你找到分割点,使得左边的数从1排列,右边的数也从1排列
解析:
用两个set维护左右集合
符合条件的 最大数== 区间长度 && 最大数==区间个数
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1000;
int a[N];
int t,n;
vector<pair<int,int> > v;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
v.clear();
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
map<int,int> mp;
set<int> s1,s2;
for(int i=1;i<=n;i++)
{
mp[a[i]]++;
s2.insert(a[i]);
}
for(int i=1;i<=n;i++)
{
if(mp[a[i]]==2)
{
s1.insert(a[i]);
mp[a[i]]--;
continue;
}
if(s1.size())
{
int mx1=*s1.rbegin();
int mx2=*s2.rbegin();
if(i-1==mx1&&mx2==(n-i+1)&&mx1==s1.size()&&mx2==s2.size())
{
v.push_back({i-1,n-i+1});
}
}
if(mp[a[i]]==1)
{
s1.insert(a[i]);
s2.erase(a[i]);
}
}
cout<<v.size()<<endl;
for(auto it : v)
{
cout<<it.first<<" "<<it.second<<endl;
}
}
}