結果

問題 No.2594 Mix shake!!
コンテスト
ユーザー hitonanode
提出日時 2026-02-23 00:00:15
言語 Python3
(3.14.3 + numpy 2.4.2 + scipy 1.17.0)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
WA  
実行時間 -
コード長 3,114 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 873 ms
コンパイル使用メモリ 20,820 KB
実行使用メモリ 15,524 KB
最終ジャッジ日時 2026-02-23 11:38:12
合計ジャッジ時間 19,371 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 54 WA * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

def solve():
    input = sys.stdin.read
    data = input().split()
    if not data:
        return
    
    n = int(data[0])
    A = [int(x) for x in data[1:n+1]]
    B = [int(x) for x in data[n+1:2*n+1]]
    C = [int(x) for x in data[2*n+1:3*n+1]]
    D = [int(x) for x in data[3*n+1:4*n+1]]
    
    V = [(A[i], B[i]) for i in range(n)]
    W = [(C[i], D[i]) for i in range(n)]
    
    # 濃度(りんご/バナナ)の降順にソートするためのキー関数
    # 比較 a/b > c/d は a*d > b*c と同値
    import functools
    def cmp(v1, v2):
        val = v1[0] * v2[1] - v1[1] * v2[0]
        if val > 0: return -1
        if val < 0: return 1
        return 0

    def check(init_V, target_W):
        s_V = sorted(init_V, key=functools.cmp_to_key(cmp))
        s_W = sorted(target_W, key=functools.cmp_to_key(cmp))
        
        # V の折れ線の頂点を構築
        pts_V = [(0, 0)]
        cur_a, cur_b = 0, 0
        for a, b in s_V:
            cur_a += a
            cur_b += b
            pts_V.append((cur_b, cur_a))
            
        # W の各頂点が V の折れ線の下にあるか判定
        cur_a, cur_b = 0, 0
        for a, b in s_W:
            cur_a += a
            cur_b += b
            # x座標が cur_b となる V の折れ線上の y座標 を求める
            # pts_V は x(バナナ) について単調増加
            for k in range(len(pts_V) - 1):
                x1, y1 = pts_V[k]
                x2, y2 = pts_V[k+1]
                if x1 <= cur_b <= x2:
                    if x1 == x2:
                        max_y = max(y1, y2)
                    else:
                        max_y = y1 + (y2 - y1) * (cur_b - x1) / (x2 - x1)
                    if cur_a > max_y + 1e-9: # 浮動小数点の誤差対策
                        return False
                    break
        return True

    # 1. メジャライゼーションのチェック
    if not check(V, W):
        print("No")
        return
        
    # 2. 濃度の順序が反転しているかチェック
    inversion = False
    for i in range(n):
        for j in range(i + 1, n):
            c_V = cmp(V[i], V[j])
            c_W = cmp(W[i], W[j])
            # 初期と目標で厳密に大小が逆転しているか
            if (c_V == -1 and c_W == 1) or (c_V == 1 and c_W == -1):
                inversion = True
                break
        if inversion:
            break
            
    if not inversion:
        print("Yes")
        return
        
    # 3. 反転がある場合、任意の2つを完全に混ぜてバッファを作れるかチェック
    for i in range(n):
        for j in range(i + 1, n):
            V_prime = []
            for k in range(n):
                if k != i and k != j:
                    V_prime.append(V[k])
            # i と j を混ぜたものを追加
            V_prime.append((V[i][0] + V[j][0], V[i][1] + V[j][1]))
            
            if check(V_prime, W):
                print("Yes")
                return
                
    print("No")

if __name__ == '__main__':
    solve()
0