import random
def check(n, k, s, p):
seat1 = s[0] + n - 1
best = 0
unlucky = 0
circle = [(0, 0)] * n # (tag, index) tag: 0=empty, 1=seat, 2=person
for i, pos in enumerate(s):
circle[pos-1] = (1, i+1)
for i, pos in enumerate(p):
if (circle[pos-1][0] == 1):
circle[pos-1] = (0, 0)
if pos-1 == seat1 - n:
best = i+1
else:
circle[pos-1] = (2, i+1)
double = circle * 2
for step in range(n):
pos = 2 * n - 1
while pos > 0:
if double[pos][0] == 1 and double[pos-1][0] == 2:
if pos == seat1:
best = double[pos-1][1]
double[pos] = (0, 0)
elif double[pos][0] != 1 and double[pos-1][0] != 1:
double[pos] = double[pos-1]
if double[pos][0] == 2:
unlucky = double[pos][1]
elif double[pos][0] == 2:
double[pos] = (0, 0)
pos -= 1
double[0] = (0, 0)
#print(double)
return (best, unlucky)
def solve(k, s, p):
seat1 = s[0]
best = -1
unlucky = (0, -1) # min(accum), position
accum = 1
# process all persons between start of the array and the seat #1 position
for i, pos in enumerate(p):
if pos <= seat1:
best = i+1
accum -= 1
else:
break
if accum < 0:
unlucky = (accum, 1)
# process all seats/persons in reverse direction
i = k
j = k-1
while i >= 0 and p[i] > seat1:
if s[j] >= p[i]: # a seat
accum += 1
j -= 1
else: # a person
accum -= 1
i -= 1
if best == -1 and accum == 0:
best = i+2 # +1 because indexing starts with 0 & +1 because of pre-decrement
if accum < unlucky[0]:
unlucky = (accum, i+2)
return (best, unlucky[1])
#ss = [2,5,8]
#pp = [3,4,6,8]
k = 25
ss = []
pp = []
v = 0
for i in range(k):
v += random.randint(1, 10)
ss.append(v)
v = 0
for i in range(k+1):
v += random.randint(1, 10)
pp.append(v)
n = max(max(ss), max(pp)) + 40
print(check(n, k, ss, pp))
print(solve(k, ss, pp))
aW1wb3J0IHJhbmRvbQoKZGVmIGNoZWNrKG4sIGssIHMsIHApOgogIHNlYXQxID0gc1swXSArIG4gLSAxCiAgYmVzdCA9IDAKICB1bmx1Y2t5ID0gMAoKICBjaXJjbGUgPSBbKDAsIDApXSAqIG4gIyAodGFnLCBpbmRleCkgdGFnOiAwPWVtcHR5LCAxPXNlYXQsIDI9cGVyc29uCiAgZm9yIGksIHBvcyBpbiBlbnVtZXJhdGUocyk6CiAgICBjaXJjbGVbcG9zLTFdID0gKDEsIGkrMSkKICBmb3IgaSwgcG9zIGluIGVudW1lcmF0ZShwKToKICAgIGlmIChjaXJjbGVbcG9zLTFdWzBdID09IDEpOgogICAgICBjaXJjbGVbcG9zLTFdID0gKDAsIDApCiAgICAgIGlmIHBvcy0xID09IHNlYXQxIC0gbjoKICAgICAgICBiZXN0ID0gaSsxCiAgICBlbHNlOgogICAgICBjaXJjbGVbcG9zLTFdID0gKDIsIGkrMSkKICBkb3VibGUgPSBjaXJjbGUgKiAyCgogIGZvciBzdGVwIGluIHJhbmdlKG4pOgogICAgcG9zID0gMiAqIG4gLSAxCiAgICB3aGlsZSBwb3MgPiAwOgogICAgICBpZiBkb3VibGVbcG9zXVswXSA9PSAxIGFuZCBkb3VibGVbcG9zLTFdWzBdID09IDI6CiAgICAgICAgaWYgcG9zID09IHNlYXQxOgogICAgICAgICAgYmVzdCA9IGRvdWJsZVtwb3MtMV1bMV0KICAgICAgICBkb3VibGVbcG9zXSA9ICgwLCAwKQogICAgICBlbGlmIGRvdWJsZVtwb3NdWzBdICE9IDEgYW5kIGRvdWJsZVtwb3MtMV1bMF0gIT0gMToKICAgICAgICBkb3VibGVbcG9zXSA9IGRvdWJsZVtwb3MtMV0KICAgICAgICBpZiBkb3VibGVbcG9zXVswXSA9PSAyOgogICAgICAgICAgdW5sdWNreSA9IGRvdWJsZVtwb3NdWzFdCiAgICAgIGVsaWYgZG91YmxlW3Bvc11bMF0gPT0gMjoKICAgICAgICBkb3VibGVbcG9zXSA9ICgwLCAwKQogICAgICBwb3MgLT0gMQogICAgZG91YmxlWzBdID0gKDAsIDApCgogICNwcmludChkb3VibGUpCiAgcmV0dXJuIChiZXN0LCB1bmx1Y2t5KQoKCmRlZiBzb2x2ZShrLCBzLCBwKToKICBzZWF0MSA9IHNbMF0KICBiZXN0ID0gLTEKICB1bmx1Y2t5ID0gKDAsIC0xKSAjIG1pbihhY2N1bSksIHBvc2l0aW9uCiAgYWNjdW0gPSAxCgogICMgcHJvY2VzcyBhbGwgcGVyc29ucyBiZXR3ZWVuIHN0YXJ0IG9mIHRoZSBhcnJheSBhbmQgdGhlIHNlYXQgIzEgcG9zaXRpb24KICBmb3IgaSwgcG9zIGluIGVudW1lcmF0ZShwKToKICAgIGlmIHBvcyA8PSBzZWF0MToKICAgICAgYmVzdCA9IGkrMQogICAgICBhY2N1bSAtPSAxCiAgICBlbHNlOgogICAgICBicmVhawoKICBpZiBhY2N1bSA8IDA6CiAgICB1bmx1Y2t5ID0gKGFjY3VtLCAxKQoKICAjIHByb2Nlc3MgYWxsIHNlYXRzL3BlcnNvbnMgaW4gcmV2ZXJzZSBkaXJlY3Rpb24KICBpID0gawogIGogPSBrLTEKICB3aGlsZSBpID49IDAgYW5kIHBbaV0gPiBzZWF0MToKICAgIGlmIHNbal0gPj0gcFtpXTogIyBhIHNlYXQKICAgICAgYWNjdW0gKz0gMQogICAgICBqIC09IDEKICAgIGVsc2U6ICMgYSBwZXJzb24KICAgICAgYWNjdW0gLT0gMQogICAgICBpIC09IDEKCiAgICBpZiBiZXN0ID09IC0xIGFuZCBhY2N1bSA9PSAwOgogICAgICBiZXN0ID0gaSsyICMgKzEgYmVjYXVzZSBpbmRleGluZyBzdGFydHMgd2l0aCAwICYgKzEgYmVjYXVzZSBvZiBwcmUtZGVjcmVtZW50CgogICAgaWYgYWNjdW0gPCB1bmx1Y2t5WzBdOgogICAgICB1bmx1Y2t5ID0gKGFjY3VtLCBpKzIpCgogIHJldHVybiAoYmVzdCwgdW5sdWNreVsxXSkKCgojc3MgPSBbMiw1LDhdCiNwcCA9IFszLDQsNiw4XQprID0gMjUKc3MgPSBbXQpwcCA9IFtdCnYgPSAwCmZvciBpIGluIHJhbmdlKGspOgogIHYgKz0gcmFuZG9tLnJhbmRpbnQoMSwgMTApCiAgc3MuYXBwZW5kKHYpCnYgPSAwCmZvciBpIGluIHJhbmdlKGsrMSk6CiAgdiArPSByYW5kb20ucmFuZGludCgxLCAxMCkKICBwcC5hcHBlbmQodikKbiA9IG1heChtYXgoc3MpLCBtYXgocHApKSArIDQwCnByaW50KGNoZWNrKG4sIGssIHNzLCBwcCkpCnByaW50KHNvbHZlKGssIHNzLCBwcCkpCg==