题目二十九:递增三元组

题目:

给定三个整数数组

A = [A1, A2, ... AN],

B = [B1, B2, ... BN],

C = [C1, C2, ... CN],

请你统计有多少个三元组(i, j, k) 满足:

1 <= i, j, k <= N
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中任意一个元素b,A中的任一元素a,C中的任一元素c,比b小的a的个数和比b大的c的个数的乘积。

实现这一逻辑的最快方法就是:通过python自带的二分函数库bisect,用里面的bisect_left与bisect_right分别获得对应的a的个数和c的个数。

程序:

import bisect
N = int(input('请输入整数N:'))
a = sorted(list(map(int,(input('请输入第一行数:').split(',')))))
b = sorted(list(map(int,(input('请输入第二行数:').split(',')))))
c = sorted(list(map(int,(input('请输入第三行数:').split(',')))))
count = 0
for i in range(N):
    x = bisect.bisect_left(a,b[i])
    y = N-bisect.bisect_right(c,b[i])
    count += x*y
print(count)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值