遞增三元組
題目
給定三個整數數組
請你統計有多少個三元組 (i,j,k) 滿足:
輸入格式
第一行包含一個整數 N。
第二行包含 N 個整數 A1,A2,…AN 。
第三行包含 N 個整數 B1,B2,…BN。
第四行包含 N 個整數 C1,C2,…CN。
輸出格式
一個整數表示答案。
數據範圍
輸入樣例
3
1 1 1
2 2 2
3 3 3
輸出樣例
27
題解
思路
- 前綴和求解
- as[i] 表示在 A[] 中有多少個數小於 b[i]
- cs[i] 表示在 C[] 中有多少個數大於 b[i]
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 20;
long long n, x, a[N], b[N], c[N], cnt[N], s[N], as[N], cs[N];
int main () {
cin >> n;
for (int i = 0; i < n; i ++) { cin >> x; a[i] = ++ x;}
for (int i = 0; i < n; i ++) { cin >> x; b[i] = ++ x;}
for (int i = 0; i < n; i ++) { cin >> x; c[i] = ++ x;}
for (int i = 0; i < n; i ++) cnt[a[i]] ++;
for (int i = 1; i < N; i ++) s[i] = s[i-1] + cnt[i];
for (int i = 0; i < n; i ++) as[i] = s[b[i]-1];
memset(cnt, 0, sizeof cnt);
memset(s, 0, sizeof s);
for (int i = 0; i < n; i ++) cnt[c[i]] ++;
for (int i = 1; i < N; i ++) s[i] = s[i-1] + cnt[i];
for (int i = 0; i < n; i ++) cs[i] = s[N-1] - s[b[i]];
long long res = 0;
for (int i = 0; i < n; i ++) res += (long long)as[i] * cs[i];
cout << res;
return 0;
}