递增三元组
lower_bound()
upper_bound()
C++ $O(n)$
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long lld;
int main () {
int N;
lld count = 0;
int i, j, k;
cin >> N;
int a[N], b[N], c[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(b, b + N);
sort(c, c + N);
for (int i = 0; i < N; i ++) {
lld x = lower_bound(a, a + N, b[i]) - a; //找到a~a+N范围内第一个大于等于b[i]的位置
lld y = c + N - upper_bound(c, c + N, b[i]); //找到c~c+N范围内第一个大于b[i]的位置
count += x * y;
}
cout << count;
return 0;
}