結果
| 問題 | No.3605 Grand Cross |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-25 02:54:21 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 437 ms / 2,000 ms |
| + 10µs | |
| コード長 | 2,303 bytes |
| 記録 | |
| コンパイル時間 | 241 ms |
| コンパイル使用メモリ | 95,844 KB |
| 実行使用メモリ | 256,392 KB |
| 最終ジャッジ日時 | 2026-07-31 20:51:03 |
| 合計ジャッジ時間 | 21,139 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 49 |
ソースコード
#generated by ChatGPT
import sys
from bisect import bisect_right
def solve_left(a, b, c, d):
"""
a 側の部分列が a[0] を含む場合の最大スコアを求める。
"""
n = len(a)
m = len(b)
# 累積和
asum = [0] * (n + 1)
bsum = [0] * (m + 1)
for i in range(n):
asum[i + 1] = asum[i] + a[i]
for i in range(m):
bsum[i + 1] = bsum[i] + b[i]
# positions[color] :=
# a において、その色が現れる位置の昇順リスト
positions = [[] for _ in range(n + m)]
for i in range(n):
positions[c[i]].append(i)
result = -1
max_center = (n - 1) // 2
# b 側の中心 j を固定する
for j in range(m):
limit = min(
j,
m - 1 - j,
max_center,
)
pos = positions[d[j]]
# limit 以下の最大位置を探す
k = bisect_right(pos, limit)
if k == 0:
continue
i = pos[k - 1]
# a 側の区間は [0, 2i]
sum_a = asum[2 * i + 1]
# b 側の区間は [j-i, j+i]
sum_b = bsum[j + i + 1] - bsum[j - i]
result = max(result, sum_a + sum_b)
return result
def main():
input_data = list(map(int, sys.stdin.buffer.read().split()))
it = iter(input_data)
t = next(it)
answers = []
for _ in range(t):
n = next(it)
m = next(it)
a = [next(it) for _ in range(n)]
b = [next(it) for _ in range(m)]
c = [next(it) - 1 for _ in range(n)]
d = [next(it) - 1 for _ in range(m)]
answer = -1
# X が A_1 を含む場合
answer = max(answer, solve_left(a, b, c, d))
# X が A_N を含む場合
a.reverse()
c.reverse()
answer = max(answer, solve_left(a, b, c, d))
# 元に戻す
a.reverse()
c.reverse()
# A と B を交換
a, b = b, a
c, d = d, c
# Y が B_1 を含む場合
answer = max(answer, solve_left(a, b, c, d))
# Y が B_M を含む場合
a.reverse()
c.reverse()
answer = max(answer, solve_left(a, b, c, d))
answers.append(str(answer))
sys.stdout.write("\n".join(answers))
if __name__ == "__main__":
main()