(二分) $O(nlogn)$
枚举b数组,若求出a数组中的最后一个小于b[i]的元素的位置和c数组中第一个大于b[i]的元素的位置,
就能得出对于b[i]有多少个满足条件的三元组,假设a中位置为p1,c中位置为p2,则b[i]的贡献为
(p1 - 1) * (n - p2 + 1);
问题转化为如何求a数组中的最后一个小于b[i]的元素的位置和c数组中第一个大于b[i]的元素的位置,
我们对a、b、c数组分别排序,通过二分计算得出元素位置,时间复杂度为O(logn);
问题可求解。
C++ 代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 9;
typedef long long ll;
int n;
int a[N],b[N],c[N];
void solve()
{
cin >> n;
for(int i = 1;i <= n;i++)cin >> a[i];
for(int i = 1;i <= n;i++)cin >> b[i];
for(int i = 1;i <= n;i++)cin >> c[i];
sort(a + 1,a + n + 1);
sort(b + 1,b + n + 1);
sort(c + 1,c + n + 1);
ll ans = 0;
for(int i = 1;i <= n;i++)//枚举b数组
{
int posa = lower_bound(a + 1,a + n + 1,b[i]) - a;//二分计算得出a数组中第一个大于等于b[i]的元素的位置
int posc = upper_bound(c + 1,c + n + 1,b[i]) - c;//二分计算得出c数组中第一个严格大于b[i]的元素的位置
ans += (posa - 1) * (n - posc + 1);
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
solve();
}