1228. 油漆面积

摘要
Title: 1228. 油漆面积
Tag: 扫描线、线段树
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

1228. 油漆面积

  • 题意

    求所有矩形的总面积

  • 思路

    扫描线

    还不错的题解:Link

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    '''
    Author: NEFU AB-IN
    Date: 2022-03-28 15:57:54
    FilePath: \ACM\Acwing\1268.py
    LastEditTime: 2022-03-28 16:00:44
    '''
    from bisect import bisect_left


    class Node():
    def __init__(self, l, r):
    self.l = l
    self.r = r
    self.cnt = 0
    self.len = 0


    class Seg():
    def __init__(self, x, y1, y2, k):
    self.x = x
    self.y1 = y1
    self.y2 = y2
    self.k = k

    def __lt__(self, t):
    return self.x < t.x


    N = int(1e5 + 10)
    tr = [Node(0, 0) for _ in range(N << 2)]
    xs, seg = [], []


    def find(x):
    return bisect_left(xs, x)


    def pushup(p):
    if tr[p].cnt:
    tr[p].len = xs[tr[p].r + 1] - xs[tr[p].l]
    elif tr[p].l == tr[p].r: #对于老版本的优化,对于叶子节点赋0,也就是没有必要往下开辟空间了
    tr[p].len = 0
    else:
    tr[p].len = tr[p << 1].len + tr[p << 1 | 1].len


    def bulid(p, l, r):
    tr[p] = Node(l, r)
    if l == r:
    return
    mid = l + r >> 1
    bulid(p << 1, l, mid)
    bulid(p << 1 | 1, mid + 1, r)


    def modify(p, l, r, k):
    if l <= tr[p].l and tr[p].r <= r:
    tr[p].cnt += k
    pushup(p)
    return
    mid = tr[p].l + tr[p].r >> 1
    if l <= mid: modify(p << 1, l, r, k)
    if r > mid: modify(p << 1 | 1, l, r, k)
    pushup(p)


    n = int(input())
    for i in range(n):
    x1, y1, x2, y2 = map(int, input().split())
    seg.append(Seg(x1, y1, y2, 1)) #记录每个线段
    seg.append(Seg(x2, y1, y2, -1))
    xs.append(y1), xs.append(y2)
    ans = 0
    seg.sort()
    xs = sorted(list(set(xs)))
    bulid(1, 0, N)
    for i in range(2 * n):
    if i > 0:
    ans += tr[1].len * (seg[i].x - seg[i - 1].x)
    modify(1, find(seg[i].y1), find(seg[i].y2) - 1, seg[i].k)

    print(ans)
使用搜索:谷歌必应百度