递增三元组
Posted wizarderror
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递增三元组相关的知识,希望对你有一定的参考价值。
给定三个整数数组 A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN], 请你统计有多少个三元组(i, j, k) 满足: 1. 1 <= i, j, k <= N 2. Ai < Bj < Ck 【输入格式】 第一行包含一个整数N。 第二行包含N个整数A1, A2, ... AN。 第三行包含N个整数B1, B2, ... BN。 第四行包含N个整数C1, C2, ... CN。 对于30%的数据,1 <= N <= 100 对于60%的数据,1 <= N <= 1000 对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000 【输出格式】 一个整数表示答案 【样例输入】 3 1 1 1 2 2 2 3 3 3 【样例输出】 27
常规解题思路:可以先对三个数组排序,然后遍历数组b,查找a数组中有多少个小于b[i]的,c数组中有多少个大于b[i]的
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 100005; int a[MAXN],b[MAXN],c[MAXN]; int n,sum; int main() { scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d",&a[i]); for(int i=0;i<n;i++)scanf("%d",&b[i]); for(int i=0;i<n;i++)scanf("%d",&c[i]); sort(a,a+n); sort(b,b+n); sort(c,c+n); sum = 0; for(int i = 0 ;i < n; i++){ int x = (lower_bound(a,a+n,b[i]) - a); int y = (n - (upper_bound(c,c+n,b[i]) - c));//这里的这两个函数那位博主用的很好 sum += x*y; } printf("%d ",sum); return 0; }
以上是关于递增三元组的主要内容,如果未能解决你的问题,请参考以下文章
2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组