代码先锋网 代码片段及技术文章聚合

递增三元组

给定三个整数数组
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

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

可以先对三个数组排序,然后遍历数组b,查找a数组中有多少个小于b[i]的,c数组中有多少个大于b[i]的。

还有就是可以直接线性求出答案,即a[x]表示第一个序列中,有多少个数字等于x,b[],c[]同理那么有:
for i = 100000 → 0
c[i] = c[i]+c[i+1]
b[i] = b[i]*c[i+1]+b[i+1]
a[i] = a[i]*b[i+1]+a[i+1]

最后a[0]就是答案

二分方法(直接函数)代码:

#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\n",sum);
  return 0;
}
版权声明:本文为weixin_43888067原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43888067/article/details/88674461

智能推荐

[AcWing] 递增三元组

递增三元组 题目 给定三个整数数组 A=[A1,A2,…AN]A=[A_1,A_2,…A_N]A=[A1​,A2​,…AN​] B=[B1,B2,…BN]B=[B_1,B_2,…B_N]B=[B1​,B2​,…BN​] C=[C1,C2,…CN]C=[C_1,C_2,…C_N]C=[C1...

递增三元组

递增三元组 给定三个整数数组 A=[A1,A2,…AN] B=[B1,B2,…BN], C=[C1,C2,…CN] 请你统计有多少个三元组 (i,j,k)(i,j,k) 满足: 1≤i,j,k≤N Ai<Bj<Ck 输入格式 第一行包含一个整数 N。 第二行包含 N 个整数 A1,A2,…AN。 第三行包含 N 个整数...

递增三元组

给定三个整数数组A=[A1,A2,…AN]A=[A1,A2,…AN] , B=[B1,B2,…BN]B=[B1,B2,…BN] , C=[C1,C2,…CN]C=[C1,C2,…CN] ,请你统计有多少个三元组 (i,j,k)(i,j,k) 满足:1≤i,j,k≤N1≤i,j,k≤N Ai&...

递增三元组

递增三元组 在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。 给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。 【输入格式】 输入的第一行包含一个整数 n...

猜你喜欢

递增三元组

递增三元组 问题描述】 一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数, 例如1 1 3 5是一个数位递增的数,而1 0 2 4不是一个数位递增的数。 给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数? 【输入格式】 输入的第一行包含一个整数 n。 【输出格式】 输出一行包含一个整数,表示答案。 【样例输入】 30 【样例输出】 26 迭代1~n 转换为字符串...

递增三元组

标题:递增三元组 给定三个整数数组 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   【输入格式】  第一行...

软件测试之App测试-功能测试

根据软件说明或用户需求验证App的各个功能实现,采用如下方法实现并评估功能测试过程: 1.运行测试 2.应用程序前后台切换测试 3.免登录测试 4.数据更新测试 5.离线浏览测试 6.App更新测试 7.定位、照相机服务 8.时间测试 9.PUSH测试(消息推销) 10.交叉测试...

并查集 07 递归的路径压缩

递归的路径压缩算法 递归的路劲压缩算法要做的是:一个find操作,p及其所有父元素都移到索引为1(0 - Based)的层去;相对于不使用递归的路径压缩算法,能更快的达到整棵树的层数为2; 方法 int find(int p) 的语义是:返回元素p的根节点;其查询路径是沿着其父节点一路查到根节点,单看这一条查询路径,其实就是一个链表,那么链表就具有了天然的递归性; 在一个链表中查它的根,其实就是找...