def perimeter(pts): n = 0 for i in range(len(pts)): dist = pts[i - 1] - pts[i] n += abs(dist.real) + abs(dist.imag) return int(n) def area(pts): # shoelace method a = 0 for i in range(len(pts)): p1, p2 = pts[i - 1], pts[i] a += p1.real * p2.imag - p2.real * p1.imag return int(a / 2) text = open(0).read() pts = [0] for line in text.splitlines(): d, n, _ = line.split() n = int(n) d = 1j ** 'RDLU'.index(d) pts.append(pts[-1] + d * n) print(area(pts) + perimeter(pts) // 2 + 1) pts = [0] for line in text.splitlines(): _, _, s = line.split() n = int(s[2:7], 16) d = 1j ** int(s[7]) pts.append(pts[-1] + d * n) print(area(pts) + perimeter(pts) // 2 + 1) # def render(graph, default='.'): # xmin, *_, xmax = sorted(int(p.real) for p in graph) # ymin, *_, ymax = sorted(int(p.imag) for p in graph) # out = '' # for y in range(ymin, ymax + 1): # for x in range(xmin, xmax + 1): # out += graph.get(complex(x, y), default) # out += '\n' # return out # def connected_components(graph): # groups = [] # while graph: # seen = set() # edge = {graph.pop()} # while edge: # seen |= edge # edge = {pp + ss for pp in edge for ss in [1, -1, 1j, -1j] if pp + ss in graph if pp + ss not in seen} # groups.append(seen) # graph -= seen # return groups # def get_solid(walls): # xmin, *_, xmax = sorted(int(p.real) for p in walls) # ymin, *_, ymax = sorted(int(p.imag) for p in walls) # mesh = {complex(x, y) for x in range(xmin, xmax + 1) for y in range(ymin, ymax + 1)} # void = mesh - walls # groups = connected_components(void) # border = lambda p: p.real in {xmin, xmax} or p.imag in {ymin, ymax} # inside = {p for g in groups if not any(border(p) for p in g) for p in g} # solid = inside | walls # return solid # def solve1(): # pos = 0 # walls = {pos} # for line in text.splitlines(): # d, n, _ = line.split() # dirx = 1j ** 'RDLU'.index(d) # goal = pos + dirx * int(n) # while pos != goal: # pos += dirx # walls.add(pos) # solid = get_solid(walls) # print(len(solid)) # def solve2(): # points = {0} # pos = 0 # for line in text.splitlines(): # _, _, rest = line.split() # n, d = int(rest[1:-1][1:][:5], 16), 'RDLU'[int(rest[-2])] # dirx = 1j ** 'RDLU'.index(d) # pos += dirx * int(n) # points.add(pos) # b2s = { # complex(bx, by) + dx + dy: 3 * complex(sx, sy) + dx + dy # for sx, bx in enumerate(sorted({p.real for p in points})) # for sy, by in enumerate(sorted({p.imag for p in points})) # for dx in [-1, 0, 1] for dy in [-1j, 0, 1j] # } # s2b = {v: k for k, v in b2s.items()} # pos, smallpos = 0, b2s[0] # walls = {smallpos} # for line in text.splitlines(): # d, n, rest = line.split() # n, d = int(rest[1:-1][1:][:5], 16), 'RDLU'[int(rest[-2])] # dirx = 1j ** 'RDLU'.index(d) # pos += dirx * int(n) # goal = b2s[pos] # while smallpos != goal: # smallpos += dirx # walls.add(smallpos) # solid = get_solid(walls) # out = 0 # for smallpos in solid: # c1, c2 = s2b[smallpos], s2b[smallpos + 1 + 1j] # w, h = (c2 - c1).real, (c2 - c1).imag # out += int(w * h) # print(out) # text = open(0).read() # solve1() # solve2()