[AcWing] 遞增三元組

遞增三元組

題目

給定三個整數數組

A=[A1,A2,AN]A=[A_1,A_2,…A_N]
B=[B1,B2,BN]B=[B_1,B_2,…B_N]
C=[C1,C2,CN]C=[C_1,C_2,…C_N]

請你統計有多少個三元組 (i,j,k) 滿足:

  1. 1i,j,kN1≤i,j,k≤N
  2. Ai<Bj<CkAi<Bj<Ck

輸入格式

第一行包含一個整數 N。

第二行包含 N 個整數 A1,A2,…AN 。

第三行包含 N 個整數 B1,B2,…BN。

第四行包含 N 個整數 C1,C2,…CN。

輸出格式

一個整數表示答案。

數據範圍

1N1050Ai,Bi,Ci1051≤N≤10^5 \\ 0≤Ai,Bi,Ci≤10^5

輸入樣例

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章