方法一:利用前缀和解题
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
using namespace std;
typedef long long LL;
const int N = 100010;
int a[N], b[N], c[N];
int cnt[N], s[N]; // 下标数字出现的次数
int as[N], cs[N]; // as[i]表示在a[]中有多少个数字小于b[i];
// s[i]表示1-i出现的总数
int main() {
int n;
cin >> n;
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]++; // 下面cnt有用
// 计算as[i]
for(int i = 0; i < n;i++) cnt[a[i]]++ ; // a[i]的个数加1
// 因为数组中的数范围是1e5,所以要循环到N为止
for(int i = 1;i < N;i++) s[i] = s[i-1] + cnt[i]; // cnt[]数组的前缀和,因为计算s[i]时i要减1,所以cont的下标从1开始
for(int i = 0;i < n;i++) as[i] = s[b[i]-1];
//计算ac[i],大于b[i]的总个数
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]];
LL res = 0;
for(int i = 0;i < n;i++){
res += (LL) as[i] * cs[i];
}
printf("%lld\n",res);
return 0;
}
方法二:利用二分
//先遍历b数组,找出a数组中小于bi的个数和c数组中大于bi的个数
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
long long int res;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < n; i++)
scanf("%d", &b[i]);
for (int i = 0; i < n; i++)
scanf("%d", &c[i]);
sort(a, a + n);
sort(b, b + n);
sort(c, c + n);
int low = 0, high = 0;
for (int i = 0; i < n; i++) {
int da = b[i];
// 求a数组中第一个小于bi的下标
int l = 0, r = n - 1;
while (l < r) { // 若a中数组没有比bi小的,那么r就一直减减,此时l=r等于0,满足条件数为0
int mid = l + r + 1 >> 1;
if (a[mid] < da)
l = mid;
else
r = mid - 1;
}
if(a[l] >= da) {
l = -1;
}
low = l;
l = 0, r = n - 1;
// 找到c数组中第一个大于bi的下标
while (l < r) { // 这里也是一样,若c数组没有比bi大的
int mid = l + r >> 1;
if (c[mid] > da)
r = mid;
else
l = mid + 1;
}
if(c[r] <= da){
r = n;
}
high = r;
// cout << "low的值" << low << endl;
// cout << " high的值" << high << endl;
res += 1ll * (low + 1) *(n - high); // 把结果转为ll类型
}
printf("%lld\n",res);
return 0;
}