思路:
先考虑中间b,c的情况,b<c,Ab>Ac,我们先找出所有满足b,c的情况并存到数组里,注意数组大小
然后,对于每对b,c,求出可以的Aa和Ad数量,相乘得到针对这对b,c的所有可能
然后所有结果相加。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const int N=515,mod=32767;
struct A{
int i,j;
}qq[130000];
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int cnt=0;
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(a[j]<a[i]){
qq[++cnt].i=i;
qq[cnt].j=j;
}
}
}
ll ans=0;
for(int i=1;i<=cnt;i++){
int left=qq[i].i,right=qq[i].j;
ll num1=0,num2=0;
for(int j=1;j<left;j++){
if(a[j]<a[left]&&a[j]<a[right])num1++;
}
for(int j=right+1;j<=n;j++){
if(a[j]>a[left]&&a[j]>a[right])num2++;
}
//printf("%d %d %d %d\n",left,right,num1,num2);
ans+=num1*num2;
}
printf("%lld\n",ans);
}
/*
6
1 2 5 4 7 8
*/
(脑子是个好东西,希望我有qwq)