标题:递增三元组给定三个整数数组
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
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。提交程序时,注意选择所期望的语言类型和编译器类型。
将三元组a,b,c排序,对于中间数组b的一个元素,找到a中小于这个元素的个数和c中大于这个元素的个数,相乘,结果为b中当前元素产生的三元组个数,遍历b中的每个元素得到的结果相加得到最终结果。我们这里寻找采用了STL中的lower_bound和upper_bound函数。
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。
lower_bound返回a中第x个大于等于b[i]中的元素,第x元素之前的都是小于b[i]的,有x个。
upper_bound返回c中第x个大于b[i]中的元素,x之前的都是小于等于b[i]的,有x个,所以大于b[i]的有n-x个。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn],c[maxn];
int main(){
//freopen("input.txt","r",stdin);
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);
int res=0;
for(int i=0;i<n;i++){
int lNum=lower_bound(a,a+n,b[i])-a;
int rNum=n-(upper_bound(c,c+n,b[i])-c);
res+=lNum*rNum;
}
cout<<res;
}