850. rectangle area ii

Too hard for me T^T have to come back tmr …

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
class Solution {
class Point {
int x, y, val;
Point (int x, int y, int val) {
this.x = x;
this.y = y;
this.val = val;
}
}

public int rectangleArea(int[][] rectangles) {
int M = 1000000007;
List<Point> data = new ArrayList<>();
for (int[] r: rectangles) {
data.add(new Point(r[0], r[1], 1));
data.add(new Point(r[2], r[3], 1));
data.add(new Point(r[0], r[3], -1));
data.add(new Point(r[2], r[1], -1));
}

Collections.sort(data, (a, b) -> (a.x - b.x));
TreeMap<Integer, Integer> map = new TreeMap<>();
int preX = -1, preY = -1, result = 0;
for (int i = 0; i < data.size(); i++) {
Point p = data.get(i);
map.put(p.y, map.getOrDefault(p.y, 0) + p.val);
if ( i == data.size() - 1 || data.get(i + 1).x > p.x) {
if (preX > -1) {
result += ((long) preY * (p.x - preX)) % M;
result %= M;
}
preY = calcY(map);
preX = p.x;
}
}
return result;
}

private int calcY(TreeMap<Integer, Integer> map) {
int result = 0, pre = -1, count = 0;
for (Map.Entry<Integer, Integer> e: map.entrySet()) {
if (pre >= 0 && count > 0) {
result += e.getKey() - pre;
}
count += e.getValue();
pre = e.getKey();
}
return result;
}
}