Files
CodeObject/storage/zeta/py/completed/3123.py
2025-05-20 17:15:06 +09:00

84 lines
2.8 KiB
Python

import sys
import math
input = sys.stdin.readline
class SprinklerArea:
_T_ONCE = 1 / 4 * math.pi
_T_DUET = 1 / 6 * math.pi + 3 ** (1 / 2) / 4
def __init__(self, size: tuple[int, int], n: int, sprinkler_pos):
self.size = size
self.map = [[0 for _ in range(size[1])] for _ in range(size[0])]
self.n = n
self.sprinkler_pos = sprinkler_pos
@staticmethod
def combine(r_before, r_after):
if r_before == 0:
return r_after
elif r_before in [1, 2, 3, 4]:
if r_after % 2 == r_before % 2:
return 6
else:
return 5
else:
return 6
@staticmethod
def get_area(type: int):
if type == 0:
return 0.0
elif type in [1, 2, 3, 4]:
return SprinklerArea._T_ONCE
elif type == 5:
return SprinklerArea._T_DUET
else:
return 1.0
def solve(self):
for pos_x, pos_y in self.sprinkler_pos:
calc_pos = []
if pos_x == 0:
if pos_y == 0:
calc_pos.append(((pos_x, pos_y), 2))
elif pos_y == self.size[1]:
calc_pos.append(((pos_x, pos_y - 1), 3))
else:
calc_pos.append(((pos_x, pos_y), 2))
calc_pos.append(((pos_x, pos_y - 1), 3))
elif pos_x == self.size[0]:
if pos_y == 0:
calc_pos.append(((pos_x - 1, pos_y), 1))
elif pos_y == self.size[1]:
calc_pos.append(((pos_x - 1, pos_y - 1), 4))
else:
calc_pos.append(((pos_x - 1, pos_y), 1))
calc_pos.append(((pos_x - 1, pos_y - 1), 4))
else:
if pos_y == 0:
calc_pos.append(((pos_x - 1, pos_y), 1))
calc_pos.append(((pos_x, pos_y), 2))
elif pos_y == self.size[1]:
calc_pos.append(((pos_x - 1, pos_y - 1), 4))
calc_pos.append(((pos_x, pos_y - 1), 3))
else:
calc_pos.append(((pos_x - 1, pos_y), 1))
calc_pos.append(((pos_x - 1, pos_y - 1), 4))
calc_pos.append(((pos_x, pos_y), 2))
calc_pos.append(((pos_x, pos_y - 1), 3))
for pos, rplus in calc_pos:
self.map[pos[0]][pos[1]] = self.combine(self.map[pos[0]][pos[1]], rplus)
return sum(sum(map(self.get_area, row)) for row in self.map)
if __name__ == '__main__':
size = tuple(map(int, input().split()))
n = int(input())
pos = [tuple(map(int, input().split())) for _ in range(n)]
solver = SprinklerArea(size, n, pos)
print(solver.solve())