Juger à plusieurs reprises la taille de N éléments
Normalement, si vous regardez chacun d'eux, vous pouvez raccourcir l'endroit où l'ordre de O (N) est amené à O (log N).
Quel côté est Vrai / Faux lorsque la liste triée est filtrée selon les conditions.
Jugement de condition
def is_ok(mid: int):
#Lisez d'abord les éléments qui ne sont pas dans la cible de recherche(S'il s'agit d'un index de liste, il est hors de portée.)
if mid < 0:
return True | False # ※1
elif mid >= N:
return True | False
return True | False #Résultat de la condition de jugement
True ----||---- False
→ True
False ----||---- True
→ False
Partie d'exécution de la recherche
def binSearch(ok: int, ng: int):
#print(ok, ng) #Premier état binaire
while abs(ok - ng) > 1: #Condition de fin (lorsque la différence est de 1 et que la limite est trouvée)
mid = (ok + ng) // 2
if is_ok(mid):
ok = mid #Si le milieu remplit les conditions, ça va jusqu'à mi, alors amenez ok au milieu
else:
ng = mid #Si mid ne remplit pas les conditions, ng est à mi-chemin, alors amenez ng au milieu
#print(ok, ng) #État binaire pour chaque coupe en deux
return ok #Il est fondamentalement acceptable de sortir.(Selon le problème)
Courir
#La plage de recherche est 0~Jusqu'à N.
INF = N + 1
binSearch(-1, INF)
INF = 10 ** 9 + 1
def main():
A, B, X = map(int, input().split())
# True - ng - ok - False
def is_ok(mid: int):
#Conditions de jugement
if mid < 0:
return True
elif mid >= INF:
return False
return A * mid + B * len(str(mid)) <= X
def binSearch(ok: int, ng: int):
#print(ok, ng)
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if is_ok(mid):
ok = mid
else:
ng = mid
#print(ok, ng)
return ok
print(binSearch(0, INF))
return
def main():
N = int(input())
L = [int(i) for i in input().split()]
L.sort()
# True ---- False
def is_ok_top(mid: int, a: int, b: int):
if mid < 0:
return True
elif mid >= N:
return False
return L[mid] < L[a] + L[b]
def binSearch_top(ok: int, ng: int, a: int, b: int):
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if is_ok_top(mid, a, b):
ok = mid
else:
ng = mid
return ok
count = 0
for a in range(0, len(L) - 2):
for b in range(a + 1, len(L) - 1):
count += binSearch_top(-1, INF, a, b) - b
print(count)
(TLE si ce n'est pas PyPy.)
def solve(N: int, A: "List[int]", B: "List[int]", C: "List[int]"):
#Valeur maximum+Définir sur 1
INF = N + 1
A.sort()
B.sort()
C.sort()
# True - ok - ng - False
def is_ok(mid: int, b: int):
#Conditions de jugement
if mid < 0:
return True
elif mid >= N:
return False
return A[mid] < b
# False - ng - ok - True
def is_ok2(mid: int, b: int):
#Conditions de jugement
if mid < 0:
return False
elif mid >= N:
return True
return C[mid] > b
def binSearch(ok: int, ng: int, b: int):
#print(ok, ng)
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if is_ok(mid, b):
ok = mid
else:
ng = mid
#print(ok, ng)
return ok
def binSearch2(ok: int, ng: int, b: int):
#print(ok, ng)
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if is_ok2(mid, b):
ok = mid
else:
ng = mid
#print(ok, ng)
return ok
sum = 0
for b in B:
a = binSearch(-1, INF, b) - 0 + 1
c = N - 1 - binSearch2(INF, -1, b) + 1
sum += a * c
#print(b, "->", a, c)
print(sum)
return
Plus précisément, "Le problème de trouver le Kth lors de l'organisation en ligne. Cependant, lorsqu'il est trop grand pour énumérer tous les éléments."
ARC037 C -100 millions de calcul de masse
Ce problème peut être résolu en triant N ^ 2 nombres pour trouver le Kth, mais jusqu'à 9 * 10 ^ 8 TLE. Par conséquent, nous changeons la façon dont nous percevons le problème. Trouvez le Kth nombre X. = Il y a K nombres inférieurs à ce nombre X. Recherche dichotomisée à la condition que le nombre de produits X ou moins soit K ou plus.
Lors de la recherche du 5ème (K = 5) de 1,1,2,2,2,2,2,4,4.
2 en X = 1 (<5) → Non 7 à X = 2 (> = 5) → ok
Le cinquième se révèle être 2.
INF = 10 ** 18 + 1
def main():
N, K = map(int, input().split())
A = sorted([int(i) for i in input().split()])
B = sorted([int(i) for i in input().split()])
# False - ng - ok - True
def is_ok(mid: int):
#Conditions de jugement
if mid < 0:
return False
elif mid >= INF:
return True
count = 0
for a in A:
maxb = mid // a #La valeur maximale de b qui est inférieure ou égale à la valeur mid lorsque le produit est pris pour chaque a
count += bisect_right(B, maxb) #Si l'indice est obtenu à partir du B trié, tous les b avant qui sont b dont le produit avec a est n ou moins, et le nombre est obtenu.
return count >= K
def binSearch(ok: int, ng: int):
#print(ok, ng)
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if is_ok(mid):
ok = mid
else:
ng = mid
#print(ok, ng)
return ok
print(binSearch(INF, 0))
return
https://www.forcia.com/blog/001434.html
Recommended Posts