递增三元组
题目
给定三个整数数组
请你统计有多少个三元组 (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;
}
来源:CSDN
作者:probeTS
链接:https://blog.csdn.net/weixin_44922845/article/details/104742789