結果
| 問題 |
No.2594 Mix shake!!
|
| コンテスト | |
| ユーザー |
Sumitacchan
|
| 提出日時 | 2023-12-10 18:19:51 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,324 bytes |
| コンパイル時間 | 91 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 12,544 KB |
| 最終ジャッジ日時 | 2024-09-27 09:06:03 |
| 合計ジャッジ時間 | 6,084 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 RE * 1 |
| other | AC * 35 RE * 50 |
ソースコード
# -*- coding: utf-8 -*-
from fractions import Fraction
import sys
from typing import Sequence
def validate(n: int, a: Sequence[int], b: Sequence[int], c: Sequence[int], d: Sequence[int]) -> None:
MIN_N = 2
MAX_N = 50
MIN_VAL = 1
MAX_VAL = 10 ** 17
assert MIN_N <= n <= MAX_N
for seq in [a, b, c, d]:
assert len(seq) == n
assert all(MIN_VAL <= x <= MAX_VAL for x in seq)
assert sum(a) == sum(c)
assert sum(b) == sum(d)
def output_ans(ans: bool) -> None:
if ans:
print("Yes")
else:
print("No")
sys.exit()
def compute_slope(n: int, a: Sequence[int], b: Sequence[int]) -> tuple[list[tuple[int, int]], list[int]]:
"""b[i]/a[i] の昇順に加算した (aの累積和,bの累積和) と、昇順のソートした際の index の列を返す"""
p: list[int] = sorted(list(range(n)), key=lambda i: Fraction(b[i], a[i]))
slope: list[tuple[int, int]] = [(0, 0)]
for i in p:
x, y = slope[-1]
slope.append((x + a[i], y + b[i]))
return slope, p
def evaluate(slope: Sequence[int], x: int) -> Fraction:
for i in range(len(slope) - 1):
if slope[i][0] <= x <= slope[i + 1][0]:
x0, y0 = slope[i]
x1, y1 = slope[i + 1]
return Fraction((x1 - x) * y0 + (x - x0) * y1, x1 - x0)
assert False
if __name__ == "__main__":
n: int = int(input())
a: list[int] = list(map(int, input().split()))
b: list[int] = list(map(int, input().split()))
c: list[int] = list(map(int, input().split()))
d: list[int] = list(map(int, input().split()))
validate(n, a, b, c, d)
ls, lp = compute_slope(n, a, b)
us, up = compute_slope(n, c, d)
assert ls[0] == us[0] == (0, 0)
assert len(ls) == len(us) == n + 1 and ls[n] == us[n]
# us が ls の上側にない場合は不可
for x, y in us[1: n]:
if y < evaluate(ls, x):
output_ans(False)
for x, y in ls[1: n]:
if y > evaluate(us, x):
output_ans(False)
# 以下、us は ls の上側にあることが保証されている
# 濃度の順番が同じならば可能
if lp == up:
output_ans(True)
# 2つの容器で濃度が同一であるような中間状態が必要
raise NotImplementedError # これから
Sumitacchan