蓝桥杯省赛之递增三元组

标题:递增三元组


给定三个整数数组
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;//输出结果
}

猜你喜欢

转载自blog.csdn.net/memeda1141/article/details/80241662