self.left = None self.right = None if l < r: m = (l + r) >> 1 self.left = Node(l, m, arr) self.right = Node(m+1, r, arr) defmodify(self, L, R, delta): if L <= self.l and self.r <= R: self.cnt += delta else: m = (self.l + self.r) >> 1 if L <= m: self.left.modify(L, R, delta) if R > m: self.right.modify(L, R, delta) if self.cnt > 0: self.ans = self.arr[self.r+1] - self.arr[self.l] else: if self.l == self.r: self.ans = 0 else: self.ans = self.left.ans + self.right.ans
classSegment: def__init__(self, xs) -> None: ys = sorted(set(xs)) d = dict() for i inrange(len(ys)): d[ys[i]] = i self.num2pos = d self.pos2num = ys # self.seg = [0 for i in range(len(ys))] self.seg = Node(0, len(ys)-1, ys)
defcount(self) -> int: # acc = 0 # for i in range(len(self.seg)): # if self.seg[i] > 0: # acc += self.pos2num[i+1] - self.pos2num[i] # return acc return self.seg.ans
defadd(self, l: int, r: int, delta: int)->None: L = self.num2pos[l] R = self.num2pos[r] # for i in range(L, R): # self.seg[i] += delta self.seg.modify(L, R-1, delta)
classSolution: defrectangleArea(self, rectangles: List[List[int]]) -> int: ops = [] for rec in rectangles: ops.append((rec[0], "A", rec[1], rec[3])) ops.append((rec[2], "D", rec[1], rec[3])) ys = [] for rec in rectangles: ys.append(rec[1]) ys.append(rec[3]) ops.sort() ans = 0 seg = Segment(ys) for i inrange(len(ops)): # print("op={}".format(ops[i])) if i > 0and ops[i][0] > ops[i-1][0]: # print("cnt={}".format(seg.count())) ans += seg.count() * (ops[i][0] - ops[i-1][0]) # print("ans={}".format(ans)) (x, ty, y1, y2) = ops[i] if ty == "A": seg.add(y1, y2, 1) else: seg.add(y1, y2, -1) return ans % int(1e9+7)