diff --git a/storage/zeta/py/completed/3123.py b/storage/zeta/py/completed/3123.py new file mode 100644 index 0000000..e20b4ab --- /dev/null +++ b/storage/zeta/py/completed/3123.py @@ -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())