Solution #530effa8-4cb6-4512-936a-f185b6871f2d

completed

Score

60% (3/5)

Runtime

51μs

Delta

-40.0% vs parent

-40.0% vs best

Regression from parent

Solution Lineage

Current60%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 type(input) is not dict:
        return 0
    raw = input.get("jobs")
    if not raw:
        return 0

    jobs = []
    starts = []
    ends = []

    for job in raw:
        if type(job) is list or type(job) is tuple:
            if len(job) == 3:
                s = job[0]
                e = job[1]
                w = job[2]
                jobs.append((s, e, w))
                starts.append(s)
                ends.append(e)

    n = len(jobs)
    if n == 0:
        return 0

    starts = sorted(set(starts))
    ends = sorted(set(ends))

    s_rank = {}
    for i, v in enumerate(starts, 1):
        s_rank[v] = i

    e_rank = {}
    for i, v in enumerate(ends, 1):
        e_rank[v] = i

    size = len(starts)
    buckets = [[] for _ in range(len(ends) + 1)]
    for s, e, w in jobs:
        buckets[e_rank[e]].append((s_rank[s], w))

    bit = [0] * (size + 1)

    for ei in range(1, len(ends) + 1):
        bucket = buckets[ei]
        if bucket:
            prev_end = ends[ei - 2] if ei > 1 else None
            for sr, w in bucket:
                s_val = starts[sr - 1]
                lo = 0
                hi = ei - 1
                while lo < hi:
                    mid = (lo + hi) >> 1
                    if ends[mid] <= s_val:
                        lo = mid + 1
                    else:
                        hi = mid
                k = lo
                q = 0
                while k:
                    v = bit[k]
                    if v > q:
                        q = v
                    k &= k - 1
                val = q + w
                idx = sr
                while idx <= size:
                    if val > bit[idx]:
                        bit[idx] = val
                    idx += idx & -idx

    ans = 0
    i = size
    while i:
        v = bit[i]
        if v > ans:
            ans = v
        i &= i - 1
    return ans

Compare with Champion

Score Difference

-40.0%

Runtime Advantage

33μs slower

Code Size

79 vs 39 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 if type(input) is not 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 starts = []9 for j in raw:
10 ends = []10 if isinstance(j, (list, tuple)) and len(j) == 3:
1111 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
12 for job in raw:12 if not jobs:
13 if type(job) is list or type(job) is tuple:13 return 0
14 if len(job) == 3:14
15 s = job[0]15 jobs.sort()
16 e = job[1]16 ends = []
17 w = job[2]17 bests = []
18 jobs.append((s, e, w))18
19 starts.append(s)19 for e, s, w in jobs:
20 ends.append(e)20 lo = 0
2121 hi = len(ends)
22 n = len(jobs)22 while lo < hi:
23 if n == 0:23 mid = (lo + hi) >> 1
24 return 024 if ends[mid] <= s:
2525 lo = mid + 1
26 starts = sorted(set(starts))26 else:
27 ends = sorted(set(ends))27 hi = mid
2828
29 s_rank = {}29 candidate = w + (bests[lo - 1] if lo else 0)
30 for i, v in enumerate(starts, 1):30 current = bests[-1] if bests else 0
31 s_rank[v] = i31
3232 if candidate > current:
33 e_rank = {}33 if ends and ends[-1] == e:
34 for i, v in enumerate(ends, 1):34 bests[-1] = candidate
35 e_rank[v] = i35 else:
3636 ends.append(e)
37 size = len(starts)37 bests.append(candidate)
38 buckets = [[] for _ in range(len(ends) + 1)]38
39 for s, e, w in jobs:39 return bests[-1] if bests else 0
40 buckets[e_rank[e]].append((s_rank[s], w))40
4141
42 bit = [0] * (size + 1)42
4343
44 for ei in range(1, len(ends) + 1):44
45 bucket = buckets[ei]45
46 if bucket:46
47 prev_end = ends[ei - 2] if ei > 1 else None47
48 for sr, w in bucket:48
49 s_val = starts[sr - 1]49
50 lo = 050
51 hi = ei - 151
52 while lo < hi:52
53 mid = (lo + hi) >> 153
54 if ends[mid] <= s_val:54
55 lo = mid + 155
56 else:56
57 hi = mid57
58 k = lo58
59 q = 059
60 while k:60
61 v = bit[k]61
62 if v > q:62
63 q = v63
64 k &= k - 164
65 val = q + w65
66 idx = sr66
67 while idx <= size:67
68 if val > bit[idx]:68
69 bit[idx] = val69
70 idx += idx & -idx70
7171
72 ans = 072
73 i = size73
74 while i:74
75 v = bit[i]75
76 if v > ans:76
77 ans = v77
78 i &= i - 178
79 return ans79
Your Solution
60% (3/5)51μs
1def solve(input):
2 if type(input) is not dict:
3 return 0
4 raw = input.get("jobs")
5 if not raw:
6 return 0
7
8 jobs = []
9 starts = []
10 ends = []
11
12 for job in raw:
13 if type(job) is list or type(job) is tuple:
14 if len(job) == 3:
15 s = job[0]
16 e = job[1]
17 w = job[2]
18 jobs.append((s, e, w))
19 starts.append(s)
20 ends.append(e)
21
22 n = len(jobs)
23 if n == 0:
24 return 0
25
26 starts = sorted(set(starts))
27 ends = sorted(set(ends))
28
29 s_rank = {}
30 for i, v in enumerate(starts, 1):
31 s_rank[v] = i
32
33 e_rank = {}
34 for i, v in enumerate(ends, 1):
35 e_rank[v] = i
36
37 size = len(starts)
38 buckets = [[] for _ in range(len(ends) + 1)]
39 for s, e, w in jobs:
40 buckets[e_rank[e]].append((s_rank[s], w))
41
42 bit = [0] * (size + 1)
43
44 for ei in range(1, len(ends) + 1):
45 bucket = buckets[ei]
46 if bucket:
47 prev_end = ends[ei - 2] if ei > 1 else None
48 for sr, w in bucket:
49 s_val = starts[sr - 1]
50 lo = 0
51 hi = ei - 1
52 while lo < hi:
53 mid = (lo + hi) >> 1
54 if ends[mid] <= s_val:
55 lo = mid + 1
56 else:
57 hi = mid
58 k = lo
59 q = 0
60 while k:
61 v = bit[k]
62 if v > q:
63 q = v
64 k &= k - 1
65 val = q + w
66 idx = sr
67 while idx <= size:
68 if val > bit[idx]:
69 bit[idx] = val
70 idx += idx & -idx
71
72 ans = 0
73 i = size
74 while i:
75 v = bit[i]
76 if v > ans:
77 ans = v
78 i &= i - 1
79 return ans
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