complete 3123.py
This commit is contained in:
83
storage/zeta/py/completed/3123.py
Normal file
83
storage/zeta/py/completed/3123.py
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
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())
|
||||||
Reference in New Issue
Block a user