递增三元组
给定三个整数数组
A=[A1,A2,…AN]
B=[B1,B2,…BN],
C=[C1,C2,…CN]
请你统计有多少个三元组 (i,j,k)(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≤100000,
0≤Ai,Bi,Ci≤100000
输入样例:
3
1 1 1
2 2 2
3 3 3
输出样例:
27
理解:
1:由数据范围 n<100000 ,所以应该是一个O(n)或者(nlogn)的算法,
那么就最多只能枚举一个数组。
2:由于数组A和数组C都只与B有关,所以我们枚举数组B,对于每一个 Bj
然后看A中有几个满足比Bj小,C中有几个满足比Bj大,然后相乘即可。
3:用前缀和来做:开一个数组cnt[i],表示在A中,i这个值出现过多少次;
for(int i=0;i<n;i++) cnt[ A[i] ]++
S[i]=cnt[0]+cnt[1]+....+cnt[i] 即前缀和S[i]表示在A中,0~i共出现多少次
那么S[Bj -1]就表示 0~Bj -1共出现多少次,就等价于在A中共有多少个数比Bj小。
还不太懂求as[]和cs[]那一部分
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>