解析:
预处理每个数右边的最大数 O(n)
用set存i前面的数,二分查询有没有比当前i大的,且比i的右边的最大值小的。
时间复杂度O(nlogn);
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+1000;
int maxn[N],n;
int a[N];
int main()
{
int t;vector<int> v;
cin>>t;
for(int p=1;p<=t;p++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int mx=0;
for(int i=n;i>=1;i--)
{
if(a[i]>mx)
{
mx=a[i];
}
maxn[i]=mx;
}
set<int> s;
for(int i=1;i<=n;i++)
{
if(!s.size()||maxn[i]==a[i])
{
s.insert(a[i]);
continue;
}
auto pos=s.upper_bound(a[i]);
if(pos!=s.end())
{
if(*pos<maxn[i])
{
v.push_back(p);
break;
}
}
s.insert(a[i]);
}
}
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
}