Problem p02616 (python)

Fixed submission:
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x>=0, A)]
neg = [*filter(lambda x: x<0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0# 使った数
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1

if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag2 = True
    if i == 0:
        flag2 = True
    elif j == 0:
        flag2 = False
    elif i == len(pos):
        flag2 = False
    elif j == len(neg):
        flag2 = True
    elif pos[i-1]*pos[i] > neg[j-1]*neg[j]:# = を抜いた
        flag2 = True
    else:
        flag2 = False

    if flag2:
        ans = ans * pow(neg[j-1],m-2,m) % m
        ans = ans * pos[i] % m
    else:
        ans = ans * pow(pos[i-1],m-2,m) % m
        ans = ans * neg[j] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x>0, A)]
neg = [*filter(lambda x: x<0, A)]
pos.sort(reverse=True)
neg.sort()
if len(pos) + len(neg) < K:
    print(0)
    exit()

ans = 1
i,j = 0,0# 使った数
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
# print(i,j)
if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag2 = True
    if i == len(pos):
        flag2 = False
    elif j == len(neg):
        flag2 = True
    elif pos[i-1]*pos[i] >= neg[j-1]*neg[j]:
        flag2 = True
    else:
        exit(1)
        flag2 = False

    if flag2:
        ans = ans * pow(neg[j-1],m-2,m) % m
        ans = ans * pos[i] % m
    else:
        ans = ans * pow(pos[i-1],m-2,m) % m
        ans = ans * neg[j] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x >= 0, A)]
neg = [*filter(lambda x: x<0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0# 使った数
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
# print(i,j)
if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag2 = True
    if i == len(pos):
        flag2 = False
    elif j == len(neg):
        flag2 = True
    elif pos[i-1]*pos[i] >= neg[j-1]*neg[j]:
        flag2 = True
    else:
        exit(1)
        flag2 = False

    if flag2:
        ans = ans * pow(neg[j-1],m-2,m) % m
        ans = ans * pos[i] % m
    else:
        ans = ans * pow(pos[i-1],m-2,m) % m
        ans = ans * neg[j] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x >= 0, A)]
neg = [*filter(lambda x: x<0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0# 使った数
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
# print(i,j)
if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag2 = True
    if i == len(pos):
        flag2 = False
    elif j == len(neg):
        flag2 = True
    elif pos[i-1]*pos[i] >= neg[j-1]*neg[j]:
        exit(1)
        flag2 = True
    else:
        flag2 = False

    if flag2:
        ans = ans * pow(neg[j-1],m-2,m) % m
        ans = ans * pos[i] % m
    else:
        ans = ans * pow(pos[i-1],m-2,m) % m
        ans = ans * neg[j] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x >= 0, A)]
neg = [*filter(lambda x: x<0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0# 使った数
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
# print(i,j)
if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag2 = True
    if i == len(pos):
        flag2 = False
    elif j == len(neg):
        flag2 = True
    elif pos[i-1]*pos[i] >= neg[j-1]*neg[j]:
        flag2 = True
    else:
        flag2 = False

    if flag2:
        ans = ans * pow(neg[j-1],m-2,m) % m
        ans = ans * pos[i] % m
    else:
        ans = ans * pow(pos[i-1],m-2,m) % m
        ans = ans * neg[j] % m
    print(ans)
    exit(1)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
pos = [*filter(lambda x: x >= 0, A)]
neg = [*filter(lambda x: x < 0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
if j % 2 == 0 or N==K:
    print(ans)
elif len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
else:
    flag = True
    if i >= len(pos)-1:
        flag = False
    elif j >= len(neg)-1:
        flag = True
    elif pos[i]*pos[i+1] >= neg[j]*neg[j+1]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pow(neg[j],m-2,m) % m
        ans = ans * pos[i+1] % m
    else:
        ans = ans * pow(pos[i],m-2,m) % m
        ans = ans * neg[j+1] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
B = [abs(a) for a in A]
B.sort(reverse=True)
pos = [*filter(lambda x: x >= 0, A)]
neg = [*filter(lambda x: x < 0, A)]
pos.sort(reverse=True)
neg.sort()

ans = 1
i,j = 0,0
while i+j < K:
    flag = True
    if i == len(pos):
        flag = False
    elif j == len(neg):
        flag = True
    elif pos[i] >= -neg[j]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pos[i] % m
        i += 1
    else:
        ans = ans * neg[j] % m
        j += 1
if len(pos) == 0:
    ans = 1
    for i in range(K):
        ans = ans * neg[len(neg)-1-i] % m
    print(ans)
elif j % 2 == 0 or N==K or len(neg) == 0:
    print(ans)
else:
    # この操作ができないものを分類
    flag = True
    if i >= len(pos)-1:
        flag = False
    elif j >= len(neg)-1:
        flag = True
    elif pos[i]*pos[i+1] >= neg[j]*neg[j+1]:
        flag = True
    else:
        flag = False

    if flag:
        ans = ans * pow(neg[j],m-2,m) % m
        ans = ans * pos[i+1] % m
    else:
        ans = ans * pow(pos[i],m-2,m) % m
        ans = ans * neg[j+1] % m
    print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
if K == 1:
    print(max(A)%m)
    exit()
p = []
q = []
r = []
for i in range(N):
    if A[i] > 0:
        p.append(A[i])
    elif A[i] < 0:
        q.append(A[i])
    else:
        r.append(A[i])
p.sort()
q.sort()
P = len(p)
Q = len(q)
if P+Q < K:
    print(0)
    exit()
else:
    if P == Q == 1:
        print(p[0]*q[0]%m)
        exit()
    if P == 0:
        if K%2 == 0:
            ans = 1
            for i in range(K):
                ans = ans * q[Q-1-i] % m
            print(ans)
        else:
            if len(r) > 0:
                print(0)
            else:
                ans = 1
                for i in range(K):
                    ans = ans * q[Q-1-i] % m
            print(ans)
    else:
        i = K# pから使う個数
        j = 0# qから使う個数
        while i > P:
            i -= 2
            j += 2
        
        while j < Q-1:
            if p[P-i]*p[P-i+1] < q[Q-j-1]*q[Q-j-2]:
                if i>1:
                    i -= 2
                j += 2
            else:
                break
        ans = 1
        for k in range(i):
            ans = ans * p[P-k-1] % m
        for l in range(j):
            ans = ans * q[Q-l-1] % m
        print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
p = []
q = []
r = []
for i in range(N):
    if A[i] > 0:
        p.append(A[i])
    elif A[i] < 0:
        q.append(A[i])
    else:
        r.append(A[i])
p.sort()
q.sort()
P = len(p)
Q = len(q)
if P+Q < K:
    print(0)
    exit()
if P > 0:
    if P+Q == K:
        ans = 1
        for i in range(P):
            ans = ans * p[i] % m
        for i in range(Q):
            ans = ans * q[i] % m
        print(ans)
    else:
        i = K
        j = 0
        while i > P:
            i -= 2
            j += 2
            
        while i >= 1 and j < Q-1:
            if p[P-i]*p[P-i+1] < q[Q-j-1]*q[Q-j-2]:
                if i-2 >= 1:
                    i -= 2
                j += 2
            else:
                break
        ans = 1
        for k in range(max(0,i)):
            ans = ans * p[P-k-1] % m
        for l in range(min(Q,j)):
            ans = ans * q[Q-l-1] % m
        print(ans)
else:
    if K % 2 == 0:
        if Q >= K:
            ans = 1
            for i in range(K):
                ans = ans * q[Q-1-i] % m
            print(ans)
        else:
            print(0)
    else:
        if len(r) > 0:
            print(0)
        else:
            ans = 1
            for i in range(K):
                ans = ans * q[Q-1-i] % m
            print(ans)

Buggy submission (verdict: Runtime Error):
N, K = map(int, input().split())
A = list(map(int, input().split()))
m = 10**9+7
p = []
q = []
r = []
for i in range(N):
    if A[i] > 0:
        p.append(A[i])
    elif A[i] < 0:
        q.append(A[i])
    else:
        r.append(A[i])
p.sort()
q.sort()
P = len(p)
Q = len(q)
if P+Q < K:
    print(0)
    exit()
if P > 0:
    if P+Q == K:
        ans = 1
        for i in range(P):
            ans = ans * p[i] % m
        for i in range(Q):
            ans = ans * q[i] % m
        print(ans)
    else:
        i = K
        j = 0
        while i > P:
            i -= 2
            j += 2
            
        while i >= 0 and j < Q-1:
            if p[P-i]*p[P-i+1] < q[Q-j-1]*q[Q-j-2]:
                i -= 2
                j += 2
            else:
                break
        ans = 1
        for k in range(max(0,i)):
            ans = ans * p[P-k-1] % m
        for l in range(min(Q,j)):
            ans = ans * q[Q-l-1] % m
        print(ans)
else:
    if K % 2 == 0:
        if Q >= K:
            ans = 1
            for i in range(K):
                ans = ans * q[Q-1-i] % m
            print(ans)
        else:
            print(0)
    else:
        if len(r) > 0:
            print(0)
        else:
            ans = 1
            for i in range(K):
                ans = ans * q[Q-1-i] % m
            print(ans)

Buggy submission (verdict: Runtime Error):
#!/usr/bin/env python3
def main():
    N, K = map(int, input().split())
    A = list(map(int, input().split()))
    m = 10**9+7
    p = []
    q = []
    r = []
    for i in range(N):
        if A[i] > 0:
            p.append(A[i])
        elif A[i] < 0:
            q.append(A[i])
        else:
            r.append(A[i])
    p.sort()
    q.sort()
    P = len(p)
    Q = len(q)
    if P > 0:
        if Q < 2:
            ans = 1
            for i in range(K):
                ans = ans * p[P-1-i] % m
            print(ans)
        elif P < K:
            print(0)
        else:
            # pの小さい２つとqの大きい２つを取り換えていく
            i = min(K, P)
            j = 0
            while i >= 0 and j < Q-1:
                if p[P-i]*p[P-i+1] < q[Q-j-1]*q[Q-j-2]:
                    i -= 2
                    j += 2
                else:
                    break
            ans = 1
            # print(i,j)
            for k in range(max(0,i)):
                ans = ans * p[P-k-1] % m
            for l in range(min(Q,j)):
                ans = ans * q[Q-l-1] % m
            print(ans)
    else:
        if K % 2 == 0:
            if Q >= K:
                ans = 1
                for i in range(K):
                    ans = ans * q[Q-1-i] % m
                print(ans)
            else:
                print(0)
        else:
            if len(r) > 0:
                print(0)
            else:
                ans = 1
                for i in range(K):
                    ans = ans * q[Q-1-i] % m
                print(ans)

if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
#!/usr/bin/env python3
def main():
    N, K = map(int, input().split())
    A = list(map(int, input().split()))
    m = 10**9+7
    p = []
    q = []
    r = []
    for i in range(N):
        if A[i] > 0:
            p.append(A[i])
        elif A[i] < 0:
            q.append(-A[i])
        else:
            r.append(A[i])
    
    if len(p) + len(q) < K:
        print(0)
        exit()
    
    p.sort()
    q.sort()
    if len(p) > 0:
        # pの小さい２つとqの大きい２つを取り換えていく
        i = min(K, len(p))
        j = 0
        while i >= 0 and j < len(q)-1:
            if p[len(p)-i]*p[len(p)-i+1] < q[len(q)-j-1]*q[len(q)-j-2]:
                i -= 2
                j += 2
            else:
                break
        ans = 1
        # print(i,j)
        for k in range(max(0,i)):
            ans = ans * p[len(p)-k-1] % m
        for l in range(min(len(q),j)):
            ans = ans * q[len(q)-l-1] % m
        print(ans)
    else:
        if K % 2 == 0:
            if len(q) >= K:
                ans = 1
                for i in range(K):
                    ans = ans * q[i] % m
                print(ans)
            else:
                print(0)
        else:
            if len(r) > 0:
                print(0)
            else:
                ans = 1
                for i in range(K):
                    ans = ans * q[i] % m
                print(-ans % m)

if __name__ == "__main__":
    main()

Buggy submission (verdict: Runtime Error):
#!/usr/bin/env python3
from collections import deque, Counter
from heapq import heappop, heappush
from bisect import bisect_right

def main():
    N, K = map(int, input().split())
    A = list(map(int, input().split()))
    m = 10**9+7
    p = []
    q = []
    r = []
    for i in range(N):
        if A[i] > 0:
            p.append(A[i])
        elif A[i] < 0:
            q.append(-A[i])
        else:
            r.append(A[i])
    
    if len(p) + len(q) < K:
        print(0)
        exit()
    
    p.sort()
    q.sort()
    # print(p,q)
    if len(p) > 0:
        # pの小さい２つとqの大きい２つを取り換えていく
        i = min(len(p)-K, len(p))
        j = len(q)
        while i < len(p)-1 and 0 < j:
            if p[i]*p[i+1] < q[j-1]*q[j-2]:
                i += 2
                j -= 2
            else:
                break
        ans = 1
        # print(i,j)
        if i < len(p):
            for k in range(i,len(p)):
                ans = ans * p[k] % m
        for l in range(max(0,j),len(q)):
            ans = ans * q[l] % m
        print(ans)
    else:
        if K % 2 == 0:
            if len(q) >= K:
                ans = 1
                for i in range(K):
                    ans = ans * q[i] % m
                print(ans)
            else:
                print(0)
        else:
            if len(r) > 0:
                print(0)
            else:
                ans = 1
                for i in range(K):
                    ans = ans * q[i] % m
                print(-ans % m)

if __name__ == "__main__":
    main()