标题:递增三元组
给定三个整数数组
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 。
第二行包含ñ个整数A1,A2,...,AN。
第三行包含ñ个整数B1,B2,... BN。
第四行包含ñ个整数C1,C2,... CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <=艾,铋,次<= 100000
【输出格式】
一个整数表示答案
【样例输入】
3
1 1 1
2 2 2
3 3 3
【样例输出】
给定三个整数数组
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 。
第二行包含ñ个整数A1,A2,...,AN。
第三行包含ñ个整数B1,B2,... BN。
第四行包含ñ个整数C1,C2,... CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <=艾,铋,次<= 100000
【输出格式】
一个整数表示答案
【样例输入】
3
1 1 1
2 2 2
3 3 3
【样例输出】
27
思路:当时就是三层暴力的,但是对于10万的数组规模n^2就会超时了,何况是三次方
接下来我整理下一位大佬的思路是O(n);
对于排好序的三个数组
b数组最为特别,因为一个数组要比它小,C数组要比它大
那么总和就是每个b中的元素在a数组中小于这个元素的*在c数组中大于b数组这个元素的个数
翠花〜上代码
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n;//定义大小
#define MAXN 100010//定义最大数据规模
long long sum=0;//定义最后的结果,因为可能是n^2所以说我们可以把他定义成long long
int a[MAXN];//定义三个数组中最小的那个
int b[MAXN];//定义三个中中间的那个
int c[MAXN];//定义三个中最大的那个
int t[MAXN];//定义t数组用来保存在数组a中小于b数组中某个元素的元素个数
int main()
{
cin>>n;//输入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);
memset(t,0,sizeof(t));//初始化t数组全部为0
int i=n-1;
int j=n-1;//a和b全部从后向前遍历
while(i>=0&&j>=0)//如果两个数组全部没有遍历完,这里说明下,如果i最后先<0那么说明b数组中某个元素比a数组中所以元素都小,如果j先小于0,那么就说明a数组中某个元素比b数组中的所有元素都小
{
if(b[j]>a[i])//如果b数组的第j个元素比a的第i个元素还要大,因为是已经排序并且从后向前遍历,所以a数组前面的都比它小
{
t[j]=i+1;//在a数组中小于b[j]的个数记录到t[j]中
j--;//b数组向前走,找到b数组更小的一个元素是不是还是小于a[i];
}
else//如果不是的话
i--;//a数组元素成更小变小看看还小不小于b[j];
}
i=0;
j=0;//b,c数组从前向后遍历
while(j<n&&i<n)
{
if(c[j]>b[i])//如果c的第j个元素大于b的第i个元素那么对于某个确定的b数组中的元素b[i]在c数组中就有n-j中可能因为c数组中比j大的下标的元素一定也比b[i]大
{
sum+=(t[i]*(n-j));//比b[i]小的a数组可以选的共有t[i]个,c数组中比b[i]还要大的数目为n-j,所有对于这个b数组的元素共有t[i]*(n-j)种可能
i++;//遍历下一个b的数组的元素看还满不满足
}
else//如果小于的话找c的下一个更大看大不大于b数组的这个元素
j++;
}
cout<<sum<<endl;//输出结果
}