原题大意
给出长度为n的三个数组A,B,C,从A中取出a, 从B中取出b, 从C中取出c,使得a < b < c,问有多少种取法?
算法分析
把A,C 排序,对于B中的每一个元素,在A中找小于它的和在C中大于它的个数相乘,然后记录总和
程序代码
//lower_bound是大于等于,upper_bound是大于
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+50;
int a[maxn], b[maxn], c[maxn];
int n;
int main(){
while(cin >> n){
for(int i = 0; i < n; i++)cin >> a[i];
for(int i = 0; i < n; i++)cin >> b[i];
for(int i = 0; i < n; i++)cin >> c[i];
sort(a, a+n);
sort(c, c+n);
ll ans = 0;
for(int i = 0; i < n; i++){
ll l = lower_bound(a, a+n, b[i]) - a;
ll r = n - (upper_bound(c, c+n, b[i]) - c);
ans += l*r;
}
cout << ans << endl;
}
return 0;
}