可以发现,公差仅能为1,2,n−1
当公差为其他数的时候,假设前半段的这个数是x,那x−1,x+1,x+2……就会被后半段选择,显然后半段不构成等差数列
那么对应i能对答案进行共享的无非就一下几种情况,记录p1到pi的最大值为mxn,最小值为mnn
对于公差为n−1,仅需特判p1,p2是否一个是1,另一个是n
对于公差为2,仅需在i=n/2和i=n/2+1的时候进行暴力
对于公差为1,仅需特判是否出现mxn==n且mnn==n−i+1,或者mnn==1且mxn==i以上两种情况
若思路没问题,代码求调awa\
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PLL;
const ll maxn=1e6+10,mod=998244353,inf=0x3f3f3f3f;
ll t;
void solve();
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--)solve();
return 0;
}ll n,a[maxn],b[maxn],c[maxn],mxn,mnn,ans;
void solve(){
cin>>n;
mxn=0,mnn=inf,ans=0;
for(int i=1;i<=n;i++)cin>>a[i],b[i]=0,c[i]=0;;
for(int i=1;i<n;i++){
mxn=max(mxn,a[i]);
mnn=min(mnn,a[i]);
if(i==2&&mxn==n&&mnn==1){
ans++;
//cout<<1<<' ';
continue;
}if((mxn==n&&mnn==n-i+1)||(mnn==1&&mxn==i)){
ans++;
//cout<<2<<i<<mxn<<mnn<<' ';
continue;
}if(i==n/2||i==n/2+1){
for(int j=1;j<=i;j++){
b[j]=a[j];
}for(int j=i+1;j<=n;j++){
c[j-i]=a[j];
}stable_sort(b+1,b+i+1);
stable_sort(c+1,c+n-i+1);
ll p=1;
for(int j=1;j<i;j++){
p&=(b[j]==b[j+1]-2);
// cout<<(b[j]==b[j+1]-2)<<' ';
}for(int j=i+1;j<n;j++){
p&=(c[j-i]==c[j-i+1]-2);
//cout<<(c[j-i]==c[j-i+1]-2)<<' ';
}if(p){
ans++;
//cout<<4<<i<<' ';
}
}
}cout<<ans<<endl;
}