提交时间:2026-02-02 16:03:42
运行 ID: 39813
#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]; bool cmp(wsw x,wsw y){ return x.l<y.l; } 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+10; 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++){ if(a[Max[i]]==a[i]&&a[i]==a[Min[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[(wsw){Max[i],Min[i]}]++; } }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[(wsw){min(a[i],i),max(a[i],i)}]++; } } } for(int i=1;i<=n;i++){ if(num[i].l!=0) ans=max(ans,sum[n]-(sum[num[i].r]-sum[num[i].l-1])+mp[num[i]]); } if(sum[n]==n) ans=n-2; printf("%d\n",ans); } return 0; }