Solution #3ae05058-ce9b-4653-b7af-94a7ed663ee4

completed

Score

80% (4/5)

Runtime

77μs

Delta

No change vs parent

-20.0% vs best

Same as parent

Solution Lineage

Current80%Same as parent
2baa50c180%Same as parent
ce0d4fdb80%Same as parent
ad9ca75f80%Same as parent
3277469d80%Improved from parent
f050941640%Regression from parent
8ec5143380%Same as parent
da62d7c880%Same as parent
3d4c689e80%Same as parent
1f2128e780%Improved from parent
92397d700%Regression from parent
7cbd604b80%Improved from parent
fc42ee8d0%Regression from parent
b0db196680%Same as parent
692ab45880%Same as parent
8996709780%Improved from parent
17dd25090%Regression from parent
2524a75f80%Same as parent
e8534c5f80%Same as parent
bc1ec94080%Same as parent
7630bd9e80%Same as parent
ae983b2480%Same as parent
8252644380%Same as parent
9db0fb8580%Improved from parent
df1d6fd340%Regression from parent
ae833bc280%Same as parent
c90b917a80%First in chain

Code

def solve(input):
    jobs = input.get("jobs", []) if isinstance(input, dict) else []

    def normalize(i):
        if i >= len(jobs):
            return []
        job = jobs[i]
        rest = normalize(i + 1)
        if isinstance(job, (list, tuple)) and len(job) == 3:
            return [(job[0], job[1], job[2])] + rest
        return rest

    arr = normalize(0)
    if not arr:
        return 0

    def sort_by_end(a):
        n = len(a)
        if n <= 1:
            return a
        mid = n // 2
        left = sort_by_end(a[:mid])
        right = sort_by_end(a[mid:])

        def merge(i, j):
            if i >= len(left):
                return right[j:]
            if j >= len(right):
                return left[i:]
            le = left[i]
            ri = right[j]
            if le[1] < ri[1] or (le[1] == ri[1] and le[0] <= ri[0]):
                return [le] + merge(i + 1, j)
            return [ri] + merge(i, j + 1)

        return merge(0, 0)

    arr = sort_by_end(arr)
    n = len(arr)

    def build_ends(i):
        if i >= n:
            return []
        return [arr[i][1]] + build_ends(i + 1)

    ends = build_ends(0)

    def upper_bound(x, lo, hi):
        if lo >= hi:
            return lo
        mid = (lo + hi) // 2
        if ends[mid] <= x:
            return upper_bound(x, mid + 1, hi)
        return upper_bound(x, lo, mid)

    memo = {}

    def dp(i):
        if i < 0:
            return 0
        if i in memo:
            return memo[i]
        s, e, w = arr[i]
        p = upper_bound(s, 0, i) - 1
        take = w + dp(p)
        skip = dp(i - 1)
        ans = take if take > skip else skip
        memo[i] = ans
        return ans

    return dp(n - 1)

Compare with Champion

Score Difference

-20.0%

Runtime Advantage

59μs slower

Code Size

71 vs 39 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 jobs = input.get("jobs", []) if isinstance(input, dict) else []2 if not isinstance(input, dict):
33 return 0
4 def normalize(i):4 raw = input.get("jobs")
5 if i >= len(jobs):5 if not raw:
6 return []6 return 0
7 job = jobs[i]7
8 rest = normalize(i + 1)8 jobs = []
9 if isinstance(job, (list, tuple)) and len(job) == 3:9 for j in raw:
10 return [(job[0], job[1], job[2])] + rest10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 return rest11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
1212 if not jobs:
13 arr = normalize(0)13 return 0
14 if not arr:14
15 return 015 jobs.sort()
1616 ends = []
17 def sort_by_end(a):17 bests = []
18 n = len(a)18
19 if n <= 1:19 for e, s, w in jobs:
20 return a20 lo = 0
21 mid = n // 221 hi = len(ends)
22 left = sort_by_end(a[:mid])22 while lo < hi:
23 right = sort_by_end(a[mid:])23 mid = (lo + hi) >> 1
2424 if ends[mid] <= s:
25 def merge(i, j):25 lo = mid + 1
26 if i >= len(left):26 else:
27 return right[j:]27 hi = mid
28 if j >= len(right):28
29 return left[i:]29 candidate = w + (bests[lo - 1] if lo else 0)
30 le = left[i]30 current = bests[-1] if bests else 0
31 ri = right[j]31
32 if le[1] < ri[1] or (le[1] == ri[1] and le[0] <= ri[0]):32 if candidate > current:
33 return [le] + merge(i + 1, j)33 if ends and ends[-1] == e:
34 return [ri] + merge(i, j + 1)34 bests[-1] = candidate
3535 else:
36 return merge(0, 0)36 ends.append(e)
3737 bests.append(candidate)
38 arr = sort_by_end(arr)38
39 n = len(arr)39 return bests[-1] if bests else 0
4040
41 def build_ends(i):41
42 if i >= n:42
43 return []43
44 return [arr[i][1]] + build_ends(i + 1)44
4545
46 ends = build_ends(0)46
4747
48 def upper_bound(x, lo, hi):48
49 if lo >= hi:49
50 return lo50
51 mid = (lo + hi) // 251
52 if ends[mid] <= x:52
53 return upper_bound(x, mid + 1, hi)53
54 return upper_bound(x, lo, mid)54
5555
56 memo = {}56
5757
58 def dp(i):58
59 if i < 0:59
60 return 060
61 if i in memo:61
62 return memo[i]62
63 s, e, w = arr[i]63
64 p = upper_bound(s, 0, i) - 164
65 take = w + dp(p)65
66 skip = dp(i - 1)66
67 ans = take if take > skip else skip67
68 memo[i] = ans68
69 return ans69
7070
71 return dp(n - 1)71
Your Solution
80% (4/5)77μs
1def solve(input):
2 jobs = input.get("jobs", []) if isinstance(input, dict) else []
3
4 def normalize(i):
5 if i >= len(jobs):
6 return []
7 job = jobs[i]
8 rest = normalize(i + 1)
9 if isinstance(job, (list, tuple)) and len(job) == 3:
10 return [(job[0], job[1], job[2])] + rest
11 return rest
12
13 arr = normalize(0)
14 if not arr:
15 return 0
16
17 def sort_by_end(a):
18 n = len(a)
19 if n <= 1:
20 return a
21 mid = n // 2
22 left = sort_by_end(a[:mid])
23 right = sort_by_end(a[mid:])
24
25 def merge(i, j):
26 if i >= len(left):
27 return right[j:]
28 if j >= len(right):
29 return left[i:]
30 le = left[i]
31 ri = right[j]
32 if le[1] < ri[1] or (le[1] == ri[1] and le[0] <= ri[0]):
33 return [le] + merge(i + 1, j)
34 return [ri] + merge(i, j + 1)
35
36 return merge(0, 0)
37
38 arr = sort_by_end(arr)
39 n = len(arr)
40
41 def build_ends(i):
42 if i >= n:
43 return []
44 return [arr[i][1]] + build_ends(i + 1)
45
46 ends = build_ends(0)
47
48 def upper_bound(x, lo, hi):
49 if lo >= hi:
50 return lo
51 mid = (lo + hi) // 2
52 if ends[mid] <= x:
53 return upper_bound(x, mid + 1, hi)
54 return upper_bound(x, lo, mid)
55
56 memo = {}
57
58 def dp(i):
59 if i < 0:
60 return 0
61 if i in memo:
62 return memo[i]
63 s, e, w = arr[i]
64 p = upper_bound(s, 0, i) - 1
65 take = w + dp(p)
66 skip = dp(i - 1)
67 ans = take if take > skip else skip
68 memo[i] = ans
69 return ans
70
71 return dp(n - 1)
Champion
100% (5/5)18μs
1def solve(input):
2 if not isinstance(input, dict):
3 return 0
4 raw = input.get("jobs")
5 if not raw:
6 return 0
7
8 jobs = []
9 for j in raw:
10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
12 if not jobs:
13 return 0
14
15 jobs.sort()
16 ends = []
17 bests = []
18
19 for e, s, w in jobs:
20 lo = 0
21 hi = len(ends)
22 while lo < hi:
23 mid = (lo + hi) >> 1
24 if ends[mid] <= s:
25 lo = mid + 1
26 else:
27 hi = mid
28
29 candidate = w + (bests[lo - 1] if lo else 0)
30 current = bests[-1] if bests else 0
31
32 if candidate > current:
33 if ends and ends[-1] == e:
34 bests[-1] = candidate
35 else:
36 ends.append(e)
37 bests.append(candidate)
38
39 return bests[-1] if bests else 0