递增三元组


题目

给定三个整数数组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。
输出格式
一个整数表示答案。
数据范围
1≤N≤105,0≤Ai,Bi,Ci≤105
输入样例:
3
1 1 1
2 2 2
3 3 3
输出样例:
27

分析

之前一直以为要满足i<=j<=k这个条件,然后一直在纠结怎么满足这个条件,,,
可是后来发现并不需要满足,所以可以直接排序,然后遍历b数组就行,记得要用long long保存结果

代码
#include<iostream>
#include<algorithm>
long long n,aa[123456],bb[123456],cc[123456];
using namespace std;
int main()
{
    long long res=0;
    cin>>n;
    for(long long i=0;i<n;i++) cin>>aa[i];
    sort(aa,aa+n);
    for(long long i=0;i<n;i++) cin>>bb[i];
    sort(bb,bb+n);
    for(long long i=0;i<n;i++) cin>>cc[i];
    sort(cc,cc+n);

    for(long long i=0;i<n;i++)
    {
       long long t=lower_bound(aa,aa+n,bb[i])-aa;
       long long tt=upper_bound(cc,cc+n,bb[i])-cc;
       res+=t*(n-tt);
    }
    cout<<res<<endl;
    return 0;
}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
逆序对的数量 逆序对的数量
题目给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数
2020-02-23
Next 
回文日期 回文日期
题目在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不
2020-02-23
  TOC