Submission #30254752


Source Code Expand

from typing import *
from math import *
import sys
input = sys.stdin.readline
Point = Tuple[int, int]
INV_PHI = (sqrt(5) - 1) / 2


def ccw(a: Point, b: Point, c: Point) -> int:
    cross = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0])
    if cross > 0:  # a -> b -> c is counter clockwise
        return 1
    elif cross == 0:
        return 0
    else:  # a -> b -> c is clockwise
        return -1


class ConvexHull:
    def __init__(self, p: List[Point]) -> None:
        self.p = p
        lower = self.lower = []
        upper = self.upper = []
        p.sort()
        lower.extend(p[:2])
        upper.extend(p[:2])
        for x in p[2:]:
            lower.append(x)
            upper.append(x)
            while len(lower) >= 3 and ccw(*lower[-3:]) <= 0:
                lower.pop(-2)
            while len(upper) >= 3 and ccw(*upper[-3:]) >= 0:
                upper.pop(-2)

    def get(self, a: int, b: int) -> int:
        p = self.upper if b > 0 else self.lower

        # golden-section search
        def f(i: int) -> int:
            x, y = p[i]
            return a * x + b * y
        l = 0
        r = len(p) - 1
        r2 = int(round(r * INV_PHI))
        f_r2 = f(r2)
        while abs(r - l) >= 6:
            l2 = r + int(round((l - r) * INV_PHI))
            f_l2 = f(l2)
            if f_l2 < f_r2:
                l, r = r, l2
            else:
                r, r2, f_r2 = r2, l2, f_l2
        if l > r:
            l, r = r, l
        return max(f(i) for i in range(l, r + 1))


Q = int(input())
S = []
for i in range(1, Q + 1):
    X, Y, A, B = map(int, input().split())
    S.append(ConvexHull([(X, Y)]))
    while (i & 1) == 0:
        i >>= 1
        p1 = S.pop().p
        p2 = S.pop().p
        S.append(ConvexHull(p1 + p2))
    print(max(s.get(A, B) for s in S))

Submission Info

Submission Time
Task Ex - Linear Maximization
User tatyam
Language PyPy3 (7.3.0)
Score 600
Code Size 1887 Byte
Status AC
Exec Time 3322 ms
Memory 130516 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 29
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All circle_01.txt, circle_02.txt, circle_03.txt, circle_04.txt, dence_01.txt, dence_02.txt, large_01.txt, large_02.txt, line2_01.txt, line2_02.txt, line2_03.txt, line_01.txt, line_02.txt, line_03.txt, prec_01.txt, prec_02.txt, sample_01.txt, sample_02.txt, small_01.txt, small_02.txt, small_03.txt, small_04.txt, small_05.txt, small_06.txt, small_07.txt, small_08.txt, small_09.txt, small_10.txt, zero_01.txt
Case Name Status Exec Time Memory
circle_01.txt AC 3284 ms 128816 KiB
circle_02.txt AC 3322 ms 130516 KiB
circle_03.txt AC 3170 ms 130348 KiB
circle_04.txt AC 3183 ms 128748 KiB
dence_01.txt AC 2180 ms 120464 KiB
dence_02.txt AC 2247 ms 121456 KiB
large_01.txt AC 2438 ms 117536 KiB
large_02.txt AC 2396 ms 116456 KiB
line2_01.txt AC 1697 ms 116724 KiB
line2_02.txt AC 1642 ms 116856 KiB
line2_03.txt AC 1685 ms 117244 KiB
line_01.txt AC 1777 ms 108380 KiB
line_02.txt AC 1714 ms 109688 KiB
line_03.txt AC 1753 ms 109104 KiB
prec_01.txt AC 2266 ms 118996 KiB
prec_02.txt AC 2312 ms 120384 KiB
sample_01.txt AC 102 ms 74832 KiB
sample_02.txt AC 86 ms 75116 KiB
small_01.txt AC 89 ms 75052 KiB
small_02.txt AC 89 ms 74904 KiB
small_03.txt AC 91 ms 74908 KiB
small_04.txt AC 88 ms 75140 KiB
small_05.txt AC 87 ms 75136 KiB
small_06.txt AC 92 ms 74972 KiB
small_07.txt AC 106 ms 76148 KiB
small_08.txt AC 145 ms 77652 KiB
small_09.txt AC 208 ms 79264 KiB
small_10.txt AC 262 ms 79736 KiB
zero_01.txt AC 2011 ms 123188 KiB