题目

![image-1667832824137](https://baicai777.cn/upload/2022/11/image-1667832824137.png

题解

利用前缀和,将在a数组中比b[i]小的值有多少枚举出来得到as[],同理,将在c数组中比b[i]大的值枚举出来得到cs[],最后通过枚举b[i]得到答案。

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],c[N];
int cs[N],as[N];
int s[N],cnt[N];

int main(){
    cin>>n;
    //+1是因为防止后面s[b[i]-1]索引为负数
    for(int i=0;i<n;i++)scanf("%d",&a[i]),a[i]++;
    for(int i=0;i<n;i++)scanf("%d",&b[i]),b[i]++;
    for(int i=0;i<n;i++)scanf("%d",&c[i]),c[i]++;
    
    for(int i=0;i<n;i++)cnt[a[i]]++;
    for(int i=1;i<N;i++)s[i]=s[i-1]+cnt[i];
    for(int i=0;i<n;i++)as[i]=s[b[i]-1];//比b[i]小的a有多少个
    
    memset(cnt,0,sizeof cnt);
    memset(s,0,sizeof s);
    for(int i=0;i<n;i++)cnt[c[i]]++;
    for(int i=1;i<N;i++)s[i]=s[i-1]+cnt[i];
    for(int i=0;i<n;i++)cs[i]=s[N-1]-s[b[i]];//比b[i]大的c有多少个
    
    long long ans=0;
    for(int i=0;i<n;i++){
        ans+=(long long )cs[i]*as[i];
    }
    cout<<ans<<endl;
    return 0;
}