増分三元組ブルーブリッジPython

16021 ワード

まずa、b、cのソート暴力にタイムアウト
# 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 """

二分の方法はいくつかのテストに合格しないのはなぜですか.これはなぜですか.