递增三元组

给定三个整数数组
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
不能通过工程设置而省略常用头文件。

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

Ideas

首先我们要根据输入数据的量级确定最终满足要求的算法时间复杂度。

如果是用三层暴力循环求递增三元组,那么算法的时间复杂度就是O(N ^ 3),肯定不可能过所有的数据。

对于100%的数据,1 <= N <= 100000,所以最终满足要求的算法时间复杂度应该是O(n * logn)的。

然后再来看题目要求,并没有要求 i j k 的大小,所以我们可以先给三个数组进行升序排序。

然后对于B数组中的每一个数bi,我们可以在A数组中找到一个小于bi的最大数a,对应的索引为a_idx,同样可以在C数组中找到一个大于bi的最小数b,对应的索引为b_idx。

根据a_idx和b_idx,我们可以求出对应A数组中小于bi的元素个数 num_1,也可以求出C数组中大于bi的元素个数 num_2,根据乘法原理,bi对应的符合条件的递增三元组个数为 num_1 * num_2。

遍历整个B数组,对于每个元素bi都在A、B数组中求出相应的 num_1 * num_2,最后累加在一起就可以了。

Code

Python

from bisect import bisect_left, bisect_rightif __name__ == '__main__':ans = 0n = int(input())A = sorted(list(map(int, input().split())))B = sorted(list(map(int, input().split())))C = sorted(list(map(int, input().split())))for item in B:num_1 = bisect_left(A, item)num_2 = n - bisect_right(C, item)print(num_1, num_2)ans += num_1 * num_2print(ans)

2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组相关推荐

  1. 2018年第九届蓝桥杯 - 省赛 - C/C++大学A组 - F.航班时间

    航班时间 [问题背景] 小h前往美国参加了蓝桥杯国际赛.小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到"现在飞机飞得真快,两小时就能到美国了". 小h对超音速飞行 ...

  2. 2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - G.螺旋折线

    螺旋折线 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0, 1)= ...

  3. 2018年第九届蓝桥杯 - 国赛 - C/C++大学B组 - B. 激光样式

    激光样式 x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱. 安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开! 国王很想知道,在目前这种bug存在的情况下,一共能 ...

  4. 2018年第九届蓝桥杯 - 省赛 - C/C++大学A组 - A. 分数

    标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来. 类似:3/2 当然,这只是加了前2项而已.分子 ...

  5. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - F. 旋转

    Ideas 有点类似于线性代数的矩阵转置,不过这个是顺时针转90°,转置相当于是逆时针转90°. 但其实原理是一样的,矩阵转置是第一行变为第一列,第二行变为第二列-- 顺时针转90°其实就是第一行变为 ...

  6. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - F. 加法变乘法

    加法变乘法 我们都知道:1+2+3+ - + 49 = 1225. 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+-+10 * 11+12+-+27 * 28+29+ ...

  7. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - F. 寒假作业

    题目 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见[图7-1.jpg]) 每个方 ...

  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - F. 牌型种数

    牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  9. 7.python解答2018年第九届蓝桥杯省赛C++A组 分数

    7.python解答2018年第九届蓝桥杯省赛C++A组 分数 标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项,求这个和是多少,结果 ...

最新文章

  1. 使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置
  2. 使用C++实现Socket编程传输文件
  3. jsf mysql_如何在Spring JSF MySQL应用程序中正确显示阿拉伯文?
  4. java class对象创建时机_Java面向对象编程-类的声明周期
  5. Builder建造者模式
  6. shell实例第18讲:利用gzexe加密shell脚本
  7. 从内存中加载DLL Delphi版(转)
  8. 两大数学家是如何撕破脸的|数学界的主义的之争
  9. 如何用excel筛选相似内容_excel如何筛选出相同内容,excel怎么用公式筛选
  10. python读json文件太大github_GitHub上最火的开源项目是啥|JSON文件实战处理
  11. C++ Web 编程 CGI公共网关接口(CGI):第一个 CGI 程序
  12. 正则表达式-基本概念与简单元字符
  13. OSCache操作详解+标签使用
  14. 生物医药数据库-生物医药全生命周期数据(网址)
  15. 用C语言多线程描述哲学家,并行程序设计-哲学家就餐问题
  16. 重庆万州公交车坠江原因公布:乘客与司机激烈争执互殴致车辆失控
  17. 基于强化学习的路径规划学习
  18. 为什么模电这么难学?一文带你透彻理解模电
  19. 写给喜欢数学和不喜欢数学的朋友们
  20. 易语言删除首尾空白符代码

热门文章

  1. 001 GIt的基本操作
  2. mysql数据库指定ip远程访问
  3. 关于FPGA的一些你必须知道的概念
  4. Node.js基本讲解
  5. 【JAVA并发编程实战】1、对象的共享
  6. 各种类型Android源代码
  7. c#入门经典笔记第十章
  8. sql分割以逗号隔开的字符串
  9. iPhone SDK发布
  10. python高级应用_Python高级编程技巧