def interval(first, last):
# Combine first and last into a list of tuples and sort them
# Sort primarily by end point (ascending)
# Sort secondarily by start point (descending) to handle subsets properly
intervals = list(zip(first, last))
intervals.sort(key=lambda x: (x[1], -x[0]))
ans = 0
p1 = -1 # Largest element in our set
p2 = -1 # Second largest element in our set
for start, end in intervals:
# Case 1: The current interval already contains at least two points from our set
if start <= p2:
continue
# Case 2: The current interval contains exactly one point from our set
if start <= p1:
# We need 1 more point. Pick the largest possible point (end).
# If p1 is already exactly 'end', we must pick 'end - 1'.
if p1 == end:
p2 = end - 1
# p1 remains 'end'
else:
p2 = p1
p1 = end
ans += 1
# Case 3: The current interval contains zero points from our set
else:
# We need 2 points. Pick the two largest possible: 'end - 1' and 'end'
p2 = end - 1
p1 = end
ans += 2
return ans
print(interval([3,2,0,4], [6,4,2,7]))
ZGVmIGludGVydmFsKGZpcnN0LCBsYXN0KToKICAgICMgQ29tYmluZSBmaXJzdCBhbmQgbGFzdCBpbnRvIGEgbGlzdCBvZiB0dXBsZXMgYW5kIHNvcnQgdGhlbQogICAgIyBTb3J0IHByaW1hcmlseSBieSBlbmQgcG9pbnQgKGFzY2VuZGluZykKICAgICMgU29ydCBzZWNvbmRhcmlseSBieSBzdGFydCBwb2ludCAoZGVzY2VuZGluZykgdG8gaGFuZGxlIHN1YnNldHMgcHJvcGVybHkKICAgIGludGVydmFscyA9IGxpc3QoemlwKGZpcnN0LCBsYXN0KSkKICAgIGludGVydmFscy5zb3J0KGtleT1sYW1iZGEgeDogKHhbMV0sIC14WzBdKSkKICAgIAogICAgYW5zID0gMAogICAgcDEgPSAtMSAjIExhcmdlc3QgZWxlbWVudCBpbiBvdXIgc2V0CiAgICBwMiA9IC0xICMgU2Vjb25kIGxhcmdlc3QgZWxlbWVudCBpbiBvdXIgc2V0CiAgICAKICAgIGZvciBzdGFydCwgZW5kIGluIGludGVydmFsczoKICAgICAgICAjIENhc2UgMTogVGhlIGN1cnJlbnQgaW50ZXJ2YWwgYWxyZWFkeSBjb250YWlucyBhdCBsZWFzdCB0d28gcG9pbnRzIGZyb20gb3VyIHNldAogICAgICAgIGlmIHN0YXJ0IDw9IHAyOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAKICAgICAgICAjIENhc2UgMjogVGhlIGN1cnJlbnQgaW50ZXJ2YWwgY29udGFpbnMgZXhhY3RseSBvbmUgcG9pbnQgZnJvbSBvdXIgc2V0CiAgICAgICAgaWYgc3RhcnQgPD0gcDE6CiAgICAgICAgICAgICMgV2UgbmVlZCAxIG1vcmUgcG9pbnQuIFBpY2sgdGhlIGxhcmdlc3QgcG9zc2libGUgcG9pbnQgKGVuZCkuCiAgICAgICAgICAgICMgSWYgcDEgaXMgYWxyZWFkeSBleGFjdGx5ICdlbmQnLCB3ZSBtdXN0IHBpY2sgJ2VuZCAtIDEnLgogICAgICAgICAgICBpZiBwMSA9PSBlbmQ6CiAgICAgICAgICAgICAgICBwMiA9IGVuZCAtIDEKICAgICAgICAgICAgICAgICMgcDEgcmVtYWlucyAnZW5kJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcDIgPSBwMQogICAgICAgICAgICAgICAgcDEgPSBlbmQKICAgICAgICAgICAgYW5zICs9IDEKICAgICAgICAgICAgCiAgICAgICAgIyBDYXNlIDM6IFRoZSBjdXJyZW50IGludGVydmFsIGNvbnRhaW5zIHplcm8gcG9pbnRzIGZyb20gb3VyIHNldAogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2UgbmVlZCAyIHBvaW50cy4gUGljayB0aGUgdHdvIGxhcmdlc3QgcG9zc2libGU6ICdlbmQgLSAxJyBhbmQgJ2VuZCcKICAgICAgICAgICAgcDIgPSBlbmQgLSAxCiAgICAgICAgICAgIHAxID0gZW5kCiAgICAgICAgICAgIGFucyArPSAyCiAgICAgICAgICAgIAogICAgcmV0dXJuIGFucwogICAgCnByaW50KGludGVydmFsKFszLDIsMCw0XSwgWzYsNCwyLDddKSk=