Solution #ec24a221-7ffc-4e1d-b91b-564783432de8

completed

Score

60% (3/5)

Runtime

70μs

Delta

+200.0% vs parent

-40.0% vs best

Improved from parent

Solution Lineage

Current60%Improved from parent
aab8251420%Regression from parent
92b8345a100%Same as parent
c4c348af100%Same as parent
9908d5a6100%Same as parent
9e652ec1100%Same as parent
a9989ddf100%Same as parent
8b739256100%Same as parent
e89bb3d4100%Same as parent
9462a7c0100%Same as parent
f79acfd9100%Improved from parent
41f0098420%Regression from parent
e2c97ff1100%Same as parent
b9b05796100%Same as parent
a6d53a91100%Same as parent
f23f1e97100%Same as parent
2c1ef298100%Same as parent
807bffb4100%Same as parent
14fae373100%Improved from parent
dbb1f88620%Regression from parent
1c204190100%Same as parent
37d6e851100%Same as parent
58b73178100%Same as parent
66b5ba20100%Same as parent
6773a310100%Improved from parent
530effa860%Regression from parent
5bd2ddd7100%Same as parent
eef58d00100%Improved from parent
0c1780d720%Regression from parent
2db3327f100%Improved from parent
3ae0505880%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):
    if not isinstance(input, dict):
        return 0
    raw = input.get("jobs")
    if not raw:
        return 0

    jobs = []
    for j in raw:
        if isinstance(j, (list, tuple)) and len(j) == 3:
            jobs.append((j[0], j[1], j[2]))

    if not jobs:
        return 0

    jobs.sort(key=lambda x: x[1])

    ends = [e for _, e, _ in jobs]

    def upper_bound(arr, x, hi):
        lo = 0
        while lo < hi:
            mid = (lo + hi) >> 1
            if arr[mid] <= x:
                lo = mid + 1
            else:
                hi = mid
        return lo

    n = len(jobs)

    def dc(l, r):
        if l > r:
            return [0]
        if l == r:
            s, e, w = jobs[l]
            return [0, w if w > 0 else 0]

        m = (l + r) >> 1
        left_dp = dc(l, m)
        right_dp = dc(m + 1, r)

        left_len = m - l + 1
        right_len = r - m

        res = [0] * (left_len + right_len + 1)

        i = 0
        while i <= left_len:
            res[i] = left_dp[i]
            i += 1

        j = 1
        while j <= right_len:
            v = right_dp[j]
            if v > res[left_len + j]:
                res[left_len + j] = v
            j += 1

        j = m + 1
        while j <= r:
            s, e, w = jobs[j]
            p = upper_bound(ends, s, m + 1) - l
            val = left_dp[p] + w
            idx = left_len + (j - m)
            if val > res[idx]:
                res[idx] = val
            j += 1

        i = 1
        total = left_len + right_len
        while i <= total:
            if res[i - 1] > res[i]:
                res[i] = res[i - 1]
            i += 1

        return res

    ans = dc(0, n - 1)[n]
    return ans if ans > 0 else 0

Compare with Champion

Score Difference

-40.0%

Runtime Advantage

52μs slower

Code Size

80 vs 39 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 if not isinstance(input, dict):2 if not isinstance(input, dict):
3 return 03 return 0
4 raw = input.get("jobs")4 raw = input.get("jobs")
5 if not raw:5 if not raw:
6 return 06 return 0
77
8 jobs = []8 jobs = []
9 for j in raw:9 for j in raw:
10 if isinstance(j, (list, tuple)) and len(j) == 3:10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 jobs.append((j[0], j[1], j[2]))11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
1212 if not jobs:
13 if not jobs:13 return 0
14 return 014
1515 jobs.sort()
16 jobs.sort(key=lambda x: x[1])16 ends = []
1717 bests = []
18 ends = [e for _, e, _ in jobs]18
1919 for e, s, w in jobs:
20 def upper_bound(arr, x, hi):20 lo = 0
21 lo = 021 hi = len(ends)
22 while lo < hi:22 while lo < hi:
23 mid = (lo + hi) >> 123 mid = (lo + hi) >> 1
24 if arr[mid] <= x:24 if ends[mid] <= s:
25 lo = mid + 125 lo = mid + 1
26 else:26 else:
27 hi = mid27 hi = mid
28 return lo28
2929 candidate = w + (bests[lo - 1] if lo else 0)
30 n = len(jobs)30 current = bests[-1] if bests else 0
3131
32 def dc(l, r):32 if candidate > current:
33 if l > r:33 if ends and ends[-1] == e:
34 return [0]34 bests[-1] = candidate
35 if l == r:35 else:
36 s, e, w = jobs[l]36 ends.append(e)
37 return [0, w if w > 0 else 0]37 bests.append(candidate)
3838
39 m = (l + r) >> 139 return bests[-1] if bests else 0
40 left_dp = dc(l, m)40
41 right_dp = dc(m + 1, r)41
4242
43 left_len = m - l + 143
44 right_len = r - m44
4545
46 res = [0] * (left_len + right_len + 1)46
4747
48 i = 048
49 while i <= left_len:49
50 res[i] = left_dp[i]50
51 i += 151
5252
53 j = 153
54 while j <= right_len:54
55 v = right_dp[j]55
56 if v > res[left_len + j]:56
57 res[left_len + j] = v57
58 j += 158
5959
60 j = m + 160
61 while j <= r:61
62 s, e, w = jobs[j]62
63 p = upper_bound(ends, s, m + 1) - l63
64 val = left_dp[p] + w64
65 idx = left_len + (j - m)65
66 if val > res[idx]:66
67 res[idx] = val67
68 j += 168
6969
70 i = 170
71 total = left_len + right_len71
72 while i <= total:72
73 if res[i - 1] > res[i]:73
74 res[i] = res[i - 1]74
75 i += 175
7676
77 return res77
7878
79 ans = dc(0, n - 1)[n]79
80 return ans if ans > 0 else 080
Your Solution
60% (3/5)70μ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[0], j[1], j[2]))
12
13 if not jobs:
14 return 0
15
16 jobs.sort(key=lambda x: x[1])
17
18 ends = [e for _, e, _ in jobs]
19
20 def upper_bound(arr, x, hi):
21 lo = 0
22 while lo < hi:
23 mid = (lo + hi) >> 1
24 if arr[mid] <= x:
25 lo = mid + 1
26 else:
27 hi = mid
28 return lo
29
30 n = len(jobs)
31
32 def dc(l, r):
33 if l > r:
34 return [0]
35 if l == r:
36 s, e, w = jobs[l]
37 return [0, w if w > 0 else 0]
38
39 m = (l + r) >> 1
40 left_dp = dc(l, m)
41 right_dp = dc(m + 1, r)
42
43 left_len = m - l + 1
44 right_len = r - m
45
46 res = [0] * (left_len + right_len + 1)
47
48 i = 0
49 while i <= left_len:
50 res[i] = left_dp[i]
51 i += 1
52
53 j = 1
54 while j <= right_len:
55 v = right_dp[j]
56 if v > res[left_len + j]:
57 res[left_len + j] = v
58 j += 1
59
60 j = m + 1
61 while j <= r:
62 s, e, w = jobs[j]
63 p = upper_bound(ends, s, m + 1) - l
64 val = left_dp[p] + w
65 idx = left_len + (j - m)
66 if val > res[idx]:
67 res[idx] = val
68 j += 1
69
70 i = 1
71 total = left_len + right_len
72 while i <= total:
73 if res[i - 1] > res[i]:
74 res[i] = res[i - 1]
75 i += 1
76
77 return res
78
79 ans = dc(0, n - 1)[n]
80 return ans if ans > 0 else 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