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。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000
【样例输入】
3
1 1 1
2 2 2
3 3 3
【样例输出】
27
这个题目写题解就是为了说明二分函数的使用啦~熟练运用各种stl嘻嘻
二分函数
lower_bound(begin, end, a)
这里返回的地址,lower_bound()是查找begin开始,end-1结束的首次大于等于a的地址,注意是地址了~~然后我们获得下标就直接减去首地址就可以啦
upper_bound(begin, end, a)是查找begin开始,end-1结束的首次大于a的地址,同上减去首地址我们就可以获得下标啦~
这个题目很简单啦~
题目思路就是先给三个数组排序,然后从第二个数组开始,0~n-1然后依次在a数组里面找小于b[i]的,在c数组里面找大于b[i]的。相乘就可以啦!
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int b[N];
int c[N];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
scanf ("%d", &a[i]);
}
for (int i = 0; i < n; i++)
{
scanf ("%d", &b[i]);
}
for (int i = 0; i < n; i++)
{
scanf ("%d", &c[i]);
}
sort(a, a + n);
sort(b, b + n);
sort(c, c + n);
int ans = 0;
for (int i = 0; i < n; i++)
{
int x = lower_bound(a, a + n, b[i]) - a;
int y = n - (upper_bound(c, c + n, b[i]) - c);
ans += x * y;
}
cout << ans << endl;
return 0;
}