一、题目链接
二、题目分析
(一)算法标签
前缀和 二分 双指针
(二)解题思路
三、AC代码
解法一(前缀和):
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int cnt_a[N], cnt_c[N];
int s_a[N], s_c[N];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
cnt_a[a[i]] ++ ;
}
for (int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &c[i]);
cnt_c[c[i]] ++ ;
}
// 求前缀和
s_a[0] = cnt_a[0];
s_c[0] = cnt_c[0];
for (int i = 1; i < N; i ++ )
s_a[i] = s_a[i - 1] + cnt_a[i];
for (int i = 1; i < N; i ++ )
s_c[i] = s_c[i - 1] + cnt_c[i];
LL cnt = 0;
for (int i = 1; i <= n; i ++ )
{
cnt += (LL)s_a[b[i] - 1] * (s_c[N] - s_c[b[i]]);
}
cout << cnt << endl;
return 0;
}