LQ0058 递增三元组二分

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0058 递增三元组二分相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2018初赛 C++ B组F题

题目描述
给定三个整数数组
A = [A1, A2, … AN],
B = [B1, B2, … BN],
C = [C1, C2, … CN],
请你统计有多少个三元组(i, j, k) 满足:

  1. 1 <= i, j, k <= N
  2. Ai < Bj < Ck

输入格式
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。
1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

输出格式
一个整数表示答案

输入样例
3
1 1 1
2 2 2
3 3 3

输出样例
27

问题分析
二分查找问题,需要排序,使用函数lower_bound()和函数upper_bound()来实现。

AC的C++语言程序如下:

/* LQ0058 递增三元组 */

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100000;
int a[N], b[N], c[N];

int main()

    int n;
    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(b, b + n);
    sort(c, c + n);

    long long ans = 0;
    for (int i = 0; i < n; i++) 
        long long pa = lower_bound(a, a + n, b[i]) - a;
        long long pc = n - (upper_bound(c, c + n, b[i]) - c);
        ans += (pa * pc);
    

    cout << ans << endl;

    return 0;

以上是关于LQ0058 递增三元组二分的主要内容,如果未能解决你的问题,请参考以下文章

递增三元组

递增三元组 -- 蓝桥杯

递增三元组

最长递增子序列(LIS) 贪心+二分详解O(nlogn)

2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组

2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组