結果
| 問題 | No.2008 Super Worker |
| コンテスト | |
| ユーザー |
Akari
|
| 提出日時 | 2022-07-15 21:48:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 801 ms / 2,000 ms |
| コード長 | 1,620 bytes |
| コンパイル時間 | 308 ms |
| コンパイル使用メモリ | 82,308 KB |
| 実行使用メモリ | 141,648 KB |
| 最終ジャッジ日時 | 2024-06-27 17:27:19 |
| 合計ジャッジ時間 | 12,043 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
import sys
# import numpy as np
def cmp(a, b):
a1, b1 = a
a2, b2 = b
return a1 + a2 * b1 >= a2 + a1 * b2
def argsort(A):
n = len(A)
length = 20
INF = [1 << 60, 0]
index = list(range(n))
work = [0] * n
for l in range(0, n, length):
r = min(l + length, n)
for i in range(l+1, r):
if cmp(A[index[i-1]], A[index[i]]): continue
tmp = index[i]
a = A[tmp]
j = i
while j > l and not cmp(A[index[j-1]], a):
index[j] = index[j-1]
j -= 1
index[j] = tmp
while length < n:
work = index[:]
for l in range(0, n, 2 * length):
li, ri = l, min(l + length, n)
l_max, r_max = min(li + length, n), min(ri + length, n)
tot = (l_max - li) + (r_max - ri)
for i in range(l, l+tot):
a = A[work[li]] if li < l_max else INF
b = A[work[ri]] if ri < r_max else INF
if cmp(a, b):
index[i] = work[li]
li += 1
else:
index[i] = work[ri]
ri += 1
length <<= 1
return index
def main():
n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
AB = [[a, b] for a, b in zip(A, B)]
x = 1
ans = 0
mod = 1_000_000_007
idx = argsort(AB)
for i in idx:
a, b = AB[i]
ans += a * x
ans %= mod
x *= b
x %= mod
print(ans)
if __name__ == '__main__':
main()
Akari