提交时间:2026-02-02 20:23:22
运行 ID: 39865
#include<bits/stdc++.h> using namespace std; const int N=4e5+10; int T,n; int a[N]; int Max[N],ciMax[N],Min[N],ciMin[N]; bool dis[N]; int sum[N]; int ans; struct wsw{ int l,r; bool operator<(const wsw temp)const{ if(l==temp.l) return r<temp.r; return l<temp.l; } }num[N]; map<wsw,int> mp; int main(){ scanf("%d",&T); while(T--){ ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Max[1]=1; ciMax[1]=0; for(int i=2;i<=n;i++){ if(a[i]>a[Max[i-1]]){ ciMax[i]=Max[i-1]; Max[i]=i; }else{ ciMax[i]=ciMax[i-1]; Max[i]=Max[i-1]; } } a[n+1]=1e9; Min[n]=n; ciMin[n]=n+1; for(int i=n-1;i>=1;i--){ if(a[i]<a[Min[i+1]]){ ciMin[i]=Min[i+1]; Min[i]=i; }else{ ciMin[i]=ciMin[i+1]; Min[i]=Min[i+1]; } } for(int i=1;i<=n;i++){ dis[i]=0; if(Max[i]==i&&i==Min[i]&&a[i]==i){ dis[i]=1; } sum[i]=sum[i-1]+dis[i]; } for(int i=1;i<=n;i++){ if(a[i]==i){ if(a[Max[i]]>a[i]&&a[ciMax[i]]<=a[i]&&a[i]>a[Min[i]]&&a[i]<=a[ciMin[i]]){ num[i]={Max[i],Min[i]}; mp[num[i]]++; }else{ num[i]={0,0}; } } // else{ // if(a[Max[a[i]-1]]==a[i]-1 || a[Min[a[i]+1]]==a[i]+1){ // num[i]={min(a[i],i),max(a[i],i)}; // mp[num[i]]++; // } // } else{ if(i<a[i]&&a[i]>a[a[i]]&&Max[a[i]-1]==i){ num[i]={i,a[i]}; mp[num[i]]++; }else if(a[i]<i&&a[a[i]]>a[i]&&Min[a[i]+1]==i){ num[i]={a[i],i}; mp[num[i]]++; }else{ num[i]={0,0}; } } } for(int i=1;i<=n;i++){ if(a[num[i].l]>a[num[i].r]) ans=max(ans,sum[n]+mp[num[i]]); mp[num[i]]=0; } ans=max(ans,sum[n]); if(sum[n]==n) ans=n-2; printf("%d\n",ans); } return 0; }