増分三元組ブルーブリッジPython
まずa、b、cのソート暴力にタイムアウト
二分はmax(j)を見つけてa[i]
二分の方法はいくつかのテストに合格しないのはなぜですか.これはなぜですか.
# coding=utf8
"""
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
【
3
1 1 1
2 2 2
3 3 3
"""
import sys
N = int(input())
a = sorted(list(map(int, (input().split()))))
b = sorted(list(map(int, (input().split()))))
c = sorted(list(map(int, (input().split()))))
if len(a) != len(b) or len(b) != len(c):
print(None)
# print(a)
# print(b)
# print(c)
SUM = 0
la, lb, lc = N - 1, N - 1, N - 1
if a[0] >= b[lb] or b[0] >= c[lc]:
# a b o
# b c r
print(0)
sys.exit() #
if c[0] > b[lb] and b[0] > a[la]:
# b a
# c b
print(N*N*N)
sys.exit()
for i in a:
for j in b:
for k in c:
if i < j < k:
SUM += 1
print(SUM)
二分はmax(j)を見つけてa[i]
N = int(input())
a = sorted(list(map(int, (input().split()))))
b = sorted(list(map(int, (input().split()))))
c = sorted(list(map(int, (input().split()))))
if len(a) != len(b) or len(b) != len(c):
print(None)
def search_lower_idx(num, nums):
if num >= nums[-1]:
return -1
if num < nums[0]:
return 0
idx = len(nums)//2
while num > nums[idx]:
idx = (len(nums) + idx)//2
while num < nums[idx]:
idx //= 2
while num == nums[idx]:
idx += 1
return idx
SUM = 0
for la in range(N):
# print('la', la)
idxb = search_lower_idx(a[la], b)
# print('idxb', idxb)
if idxb == -1:
continue
for lb in range(idxb, N):
# print(f'lb {lb}')
idxc = search_lower_idx(b[lb], c)
# print(f'idxc {idxc}')
if idxc != -1:
SUM += N - idxc
# print(f'SUM {SUM}')
# print(f'la {la} SUM {SUM}
')
print(SUM)
"""
4
3 4 2 1
3 4 2 1
3 4 2 1
"""
二分の方法はいくつかのテストに合格しないのはなぜですか.これはなぜですか.