[AcWing] 递增三元组

╄→尐↘猪︶ㄣ 提交于 2020-03-09 09:58:36

递增三元组

题目

给定三个整数数组

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!