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);
}
posted @ 2023-06-17 16:54  5k_sync_closer  阅读(11)  评论(0编辑  收藏  举报  来源