2018年第九届蓝桥杯省赛C++B组F题

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。

对于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;
}
发布了53 篇原创文章 · 获赞 2 · 访问量 1353

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/104561103