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