結果

問題 No.3675 偏光板
コンテスト
ユーザー 👑 みうね
提出日時 2026-08-21 16:32:13
言語 Python3
(3.14.7 + numpy 2.5.2 + scipy 1.18.0)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
RE  
実行時間 -
コード長 1,680 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 667 ms
コンパイル使用メモリ 21,468 KB
実行使用メモリ 20,700 KB
最終ジャッジ日時 2026-09-04 22:30:06
合計ジャッジ時間 17,319 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 6
other RE * 54
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys
from shapely.geometry import box, Point
from shapely.ops import unary_union

def solve():
    # 入力を全て読み込む
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    X = int(input_data[0])
    Y = int(input_data[1])
    N = int(input_data[2])
    
    v_circles = []
    h_circles = []
    
    idx = 3
    for _ in range(N):
        x = int(input_data[idx])
        y = int(input_data[idx+1])
        r = int(input_data[idx+2])
        d = input_data[idx+3]
        idx += 4
        
        # Point.bufferを用いて円を作成。
        # 相対誤差 10^-6 以下を担保するため、resolutionを十分に大きく設定 (2048だと1円あたり約8000頂点)
        circle = Point(x, y).buffer(r, resolution=2048)
        if d == 'V':
            v_circles.append(circle)
        else:
            h_circles.append(circle)
            
    # 窓枠を定義
    window = box(0, 0, X, Y)
    
    # 窓枠内の V の領域の面積
    v_area = 0.0
    if v_circles:
        # Vの円の和集合を求め、窓枠で切り取る
        v_union = unary_union(v_circles).intersection(window)
        v_area = v_union.area
        
    # 窓枠内の H の領域の面積
    h_area = 0.0
    if h_circles:
        # Hの円の和集合を求め、窓枠で切り取る
        h_union = unary_union(h_circles).intersection(window)
        h_area = h_union.area
        
    # 簡略化された式に基づく最終計算
    ans = X * Y - 0.5 * v_area - 0.5 * h_area
    
    # 精度を落とさないよう、小数点以下15桁まで出力
    print(f"{ans:.15f}")

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