P8667 [蓝桥杯 2018 省 B] 递增三元组 题解
枚举 $j_0$,考虑有多少满足条件的三元组的 $j=j_0$。
根据题意,$(i,j_0,k)$ 满足条件当且仅当 $a_i<b_{j_0}<c_k$,
则 $(i,j_0,k)$ 的个数即为 $a_i<b_{j_0},c_k>b_{j_0}$ 的 $(i,k)$ 的对数,
即 $\sum[a_i<b_{j_0}<c_k]=(\sum[a_i<b_{j_0}])(\sum[c_k>b_{j_0}])$。
对每个 $j_0$ 分别二分 $\sum[a_i<b_{j_0}],\sum[c_k>b_{j_0}]$ 即可。
#include <cstdio>
#include <algorithm>
using namespace std;
int n, a[100050], b[100050], c[100050];
long long q;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", a + i);
for (int i = 1; i <= n; ++i)
scanf("%d", b + i);
for (int i = 1; i <= n; ++i)
scanf("%d", c + i);
sort(a + 1, a + n + 1);
sort(c + 1, c + n + 1);
for (int i = 1; i <= n; ++i)
q += 1ll * (lower_bound(a + 1, a + n + 1, b[i]) - a - 1) * (n - (upper_bound(c + 1, c + n + 1, b[i]) - c - 1));
return !printf("%lld", q);
}