#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
// 求两个数组中 在b数组有多少个数小于a[i],大于a[i];有三种方法,一个排序加二分,一个是前缀和,一个是双指针就是归并排序那种
typedef long long LL;
int a[N],b[N],c[N];
int ac[N],cc[N]; // ac存储a数组有多少个数比b[i]小,cc存储c数组中比b[i]大的个数
int cnt[N], s[N]; // 表前缀和
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i],a[i]++; // ++是因为后面要用到前缀和,下标最好从1开始,a[i]值要大于等于1
for(int i=0;i<n;i++) cin>>b[i],b[i]++;
for(int i=0;i<n;i++) cin>>c[i],c[i]++;
// 求ac
for(int i=0;i<n;i++) cnt[a[i]]++;
for(int i=1;i<N;i++) s[i]=s[i-1]+cnt[i]; // 求cnt的前缀和
for(int i=0;i<n;i++) ac[i]=s[b[i]-1]; //ac存储a数组有多少个数比b小
// 求cc
memset(s,0,sizeof s);
memset(cnt,0,sizeof cnt);
for(int i=0;i<n;i++) cnt[c[i]]++;
for(int i=1;i<N;i++) s[i]=s[i-1]+cnt[i]; // 求cnt的前缀和
for(int i=0;i<n;i++) cc[i]=s[N-1]-s[b[i]]; //cc存储c数组中比b大
// 枚举每个b
LL res=0;
for(int i=0;i<n;i++) res+=(LL)ac[i]*cc[i];
cout<<res<<endl;
return 0;
}
第九届蓝桥杯省赛 递增三元组
最新推荐文章于 2024-05-19 19:33:09 发布