[蓝桥杯 2018 省 B] 递增三元组
题目描述
给定三个整数数组 A = [ A 1 , A 2 , ⋯ , A N ] A = [A_1, A_2,\cdots, A_N] A=[A1,A2,⋯,AN], B = [ B 1 , B 2 , ⋯ , B N ] B = [B_1, B_2,\cdots, B_N] B=[B1,B2,⋯,BN], C = [ C 1 , C 2 , ⋯ , C N ] C = [C_1, C_2,\cdots,C_N] C=[C1,C2,⋯,CN]。
请你统计有多少个三元组 ( i , j , k ) (i, j, k) (i,j,k) 满足:
- 1 ≤ i , j , k ≤ N 1 \le i, j, k \le N 1≤i,j,k≤N
- A i < B j < C k A_i < B_j < C_k Ai<Bj<Ck
输入格式
第一行包含一个整数 N N N。
第二行包含 N N N 个整数 A 1 , A 2 , ⋯ , A N A_1, A_2,\cdots, A_N A1,A2,⋯,AN。
第三行包含 N N N 个整数 B 1 , B 2 , ⋯ , B N B_1, B_2,\cdots, B_N B1,B2,⋯,BN。
第四行包含 N N N 个整数 C 1 , C 2 , ⋯ , C N C_1, C_2,\cdots, C_N C1,C2,⋯,CN。
输出格式
一个整数表示答案
样例 #1
样例输入 #1
3
1 1 1
2 2 2
3 3 3
样例输出 #1
27
提示
对于 30 % 30\% 30% 的数据, 1 ≤ N ≤ 100 1 \le N \le 100 1≤N≤100。
对于 60 % 60\% 60% 的数据, 1 ≤ N ≤ 1000 1 \le N \le 1000 1≤N≤1000。
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1≤N≤105, 0 ≤ A i , B i , C i ≤ 1 0 5 0 \le A_i, B_i, C_i \le 10^5 0≤Ai,Bi,Ci≤105。
代码
#include<iostream>
using namespace std;
int n;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int as[N], cs[N];
int cnt[N], s[N];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]), a[i]++;
for (int i = 0; i < n; i++) scanf("%d", &b[i]), b[i]++;
for (int i = 0; i < n; i++) scanf("%d", &c[i]), c[i]++;
for (int i = 0; i < n; i++) cnt[a[i]]++;
for (int i = 0; i < N; i++) {
cnt[i] += cnt[i - 1];
as[i] = cnt[i - 1];
}
for (int i = 0; i < n; i++) s[c[i]]++;
for (int i = 0; i < N; i++) s[i] += s[i - 1];
for (int i = 0; i < N; i++) cs[i] = s[N - 1] - s[i];
long long res = 0;
for (int i = 0; i < n; i++)res += (long long)as[b[i]] * cs[b[i]];
cout << res;
return 0;
}