| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 39858 | 黄子睿 | 【S】T4 | C++ | 解答错误 | 5 | 334 MS | 13184 KB | 2412 | 2026-02-02 20:16:17 |
#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(dis[i]) continue; 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{ 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]]++; // } // } } for(int i=1;i<=n;i++){ if(num[i].l!=0&&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; }