Solution #2baa50c1-9c81-46b8-8af0-08d964c9e270

completed

Score

80% (4/5)

Runtime

57μs

Delta

No change vs parent

-20.0% vs best

Same as parent

Solution Lineage

Current80%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 []
    if not jobs:
        return 0

    def build(i, acc):
        if i >= len(jobs):
            return acc
        job = jobs[i]
        if isinstance(job, (list, tuple)) and len(job) == 3:
            return build(i + 1, acc + [tuple(job)])
        return build(i + 1, acc)

    arr = build(0, [])
    if not arr:
        return 0

    def merge(a, b, key):
        if not a:
            return b
        if not b:
            return a
        if key(a[0]) <= key(b[0]):
            return [a[0]] + merge(a[1:], b, key)
        return [b[0]] + merge(a, b[1:], key)

    def mergesort(a, key):
        n = len(a)
        if n <= 1:
            return a
        mid = n // 2
        return merge(mergesort(a[:mid], key), mergesort(a[mid:], key), key)

    arr = mergesort(arr, lambda x: x[0])
    n = len(arr)

    starts = list(map(lambda x: x[0], arr))

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

    memo = {}

    def dp(i):
        if i >= n:
            return 0
        if i in memo:
            return memo[i]
        s, e, w = arr[i]
        j = lower_bound(e, i + 1, n)
        take = w + dp(j)
        skip = dp(i + 1)
        memo[i] = take if take > skip else skip
        return memo[i]

    return dp(0)

Compare with Champion

Score Difference

-20.0%

Runtime Advantage

39μs slower

Code Size

61 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):
3 if not jobs:3 return 0
4 return 04 raw = input.get("jobs")
55 if not raw:
6 def build(i, acc):6 return 0
7 if i >= len(jobs):7
8 return acc8 jobs = []
9 job = jobs[i]9 for j in raw:
10 if isinstance(job, (list, tuple)) and len(job) == 3:10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 return build(i + 1, acc + [tuple(job)])11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
12 return build(i + 1, acc)12 if not jobs:
1313 return 0
14 arr = build(0, [])14
15 if not arr:15 jobs.sort()
16 return 016 ends = []
1717 bests = []
18 def merge(a, b, key):18
19 if not a:19 for e, s, w in jobs:
20 return b20 lo = 0
21 if not b:21 hi = len(ends)
22 return a22 while lo < hi:
23 if key(a[0]) <= key(b[0]):23 mid = (lo + hi) >> 1
24 return [a[0]] + merge(a[1:], b, key)24 if ends[mid] <= s:
25 return [b[0]] + merge(a, b[1:], key)25 lo = mid + 1
2626 else:
27 def mergesort(a, key):27 hi = mid
28 n = len(a)28
29 if n <= 1:29 candidate = w + (bests[lo - 1] if lo else 0)
30 return a30 current = bests[-1] if bests else 0
31 mid = n // 231
32 return merge(mergesort(a[:mid], key), mergesort(a[mid:], key), key)32 if candidate > current:
3333 if ends and ends[-1] == e:
34 arr = mergesort(arr, lambda x: x[0])34 bests[-1] = candidate
35 n = len(arr)35 else:
3636 ends.append(e)
37 starts = list(map(lambda x: x[0], arr))37 bests.append(candidate)
3838
39 def lower_bound(x, lo, hi):39 return bests[-1] if bests else 0
40 if lo >= hi:40
41 return lo41
42 mid = (lo + hi) // 242
43 if starts[mid] < x:43
44 return lower_bound(x, mid + 1, hi)44
45 return lower_bound(x, lo, mid)45
4646
47 memo = {}47
4848
49 def dp(i):49
50 if i >= n:50
51 return 051
52 if i in memo:52
53 return memo[i]53
54 s, e, w = arr[i]54
55 j = lower_bound(e, i + 1, n)55
56 take = w + dp(j)56
57 skip = dp(i + 1)57
58 memo[i] = take if take > skip else skip58
59 return memo[i]59
6060
61 return dp(0)61
Your Solution
80% (4/5)57μs
1def solve(input):
2 jobs = input.get("jobs", []) if isinstance(input, dict) else []
3 if not jobs:
4 return 0
5
6 def build(i, acc):
7 if i >= len(jobs):
8 return acc
9 job = jobs[i]
10 if isinstance(job, (list, tuple)) and len(job) == 3:
11 return build(i + 1, acc + [tuple(job)])
12 return build(i + 1, acc)
13
14 arr = build(0, [])
15 if not arr:
16 return 0
17
18 def merge(a, b, key):
19 if not a:
20 return b
21 if not b:
22 return a
23 if key(a[0]) <= key(b[0]):
24 return [a[0]] + merge(a[1:], b, key)
25 return [b[0]] + merge(a, b[1:], key)
26
27 def mergesort(a, key):
28 n = len(a)
29 if n <= 1:
30 return a
31 mid = n // 2
32 return merge(mergesort(a[:mid], key), mergesort(a[mid:], key), key)
33
34 arr = mergesort(arr, lambda x: x[0])
35 n = len(arr)
36
37 starts = list(map(lambda x: x[0], arr))
38
39 def lower_bound(x, lo, hi):
40 if lo >= hi:
41 return lo
42 mid = (lo + hi) // 2
43 if starts[mid] < x:
44 return lower_bound(x, mid + 1, hi)
45 return lower_bound(x, lo, mid)
46
47 memo = {}
48
49 def dp(i):
50 if i >= n:
51 return 0
52 if i in memo:
53 return memo[i]
54 s, e, w = arr[i]
55 j = lower_bound(e, i + 1, n)
56 take = w + dp(j)
57 skip = dp(i + 1)
58 memo[i] = take if take > skip else skip
59 return memo[i]
60
61 return dp(0)
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