题目

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 5;
int a[maxn][maxn], p[maxn], d[maxn][maxn], n, l_big[maxn], r_small[maxn];
void init(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
d[i][j] = 0;
}
}
l_big[0] = r_small[n + 1] = -1;
}
void solve(){
int i, j;
cin >> n;
init();
for(i = 1; i <= n; i++){
cin >> p[i];
}
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++) l_big[j] = r_small[j] = 0;
for(j = i - 1; j >= 1; j--){
l_big[j] = l_big[j + 1];
if(p[j] > p[i]) l_big[j]++;
}
for(j = i + 1; j <= n; j++){
r_small[j] = r_small[j - 1];
if(p[j] < p[i]) r_small[j]++;
}
int l = i, r = i, l2 = i, r2 = i;
while(1){
while(l >= 1 && l_big[l] == l_big[l - 1]) l--;
while(r <= n && r_small[r] == r_small[r + 1]) r++;
if(l_big[l] == r_small[r] && l_big[l] != -1){
//cout << i << ' ' << l << ' ' << l2 << ' ' << r2 << ' ' << r << ' ' << l_big[i][l] << '\n';
d[l][r2]++, d[l2 + 1][r + 1]++, d[l2 + 1][r2]--, d[l][r + 1]--;
}
l--, r++;
l2 = l, r2 = r;
if(l < 1 || r > n) break;
}
}
int res = 0;
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++){
a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + d[i][j];
if(i < j && a[i][j]) res++;
}
}
cout << n * (n - 1) / 2 - res << '\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--){
solve();
}
return 0;
}