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
| # 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
import sys
from fractions import Fraction
input = sys.stdin.readline
def solve():
n_line = input().strip()
if not n_line:
return
n = int(n_line)
segs = []
for _ in range(n):
x0, x1, y = map(int, input().split())
l, r = (x0, x1) if x0 <= x1 else (x1, x0)
segs.append((l, r, y, r - l))
best = 0
for i in range(n):
for endpoint in range(2):
anchorX = segs[i][0] if endpoint == 0 else segs[i][1]
anchorY = segs[i][2]
base = segs[i][3]
events = [] # (k: Fraction, type: 0 start / 1 end, weight)
for j in range(n):
if j == i:
continue
dy = segs[j][2] - anchorY
if dy == 0:
continue
k1 = Fraction(segs[j][0] - anchorX, dy)
k2 = Fraction(segs[j][1] - anchorX, dy)
lo, hi = (k1, k2) if k1 <= k2 else (k2, k1)
events.append((lo, 0, segs[j][3]))
events.append((hi, 1, segs[j][3]))
events.sort(key=lambda e: (e[0], e[1])) # start(0) before end(1)
cur = base
if cur > best:
best = cur
idx = 0
m = len(events)
while idx < m:
v = events[idx][0]
while idx < m and events[idx][0] == v and events[idx][1] == 0:
cur += events[idx][2]
idx += 1
if cur > best:
best = cur
while idx < m and events[idx][0] == v and events[idx][1] == 1:
cur -= events[idx][2]
idx += 1
print(best)
if __name__ == "__main__":
solve()
|