84 lines
2.8 KiB
Python
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())
|