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 <= i, j, k <= N
- 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 递增三元组二分的主要内容,如果未能解决你的问题,请参考以下文章