区间交集

标题:区间交集 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
给定一组闭区间,其中部分区间存在交集。任意两个给定区间的交集,称为公共区间(如:[1,2],[2,3]的公共区间为[2,2],[3,5],[3,6]的公共区间为[3,5])。公共区间之间若存在交集,则需要合并(如:[1,3],[3,5]区间存在交集[3,3],须合并为[1,5])。按升序排列输出合并后的区间列表。


import sys

ranges = []

for line in sys.stdin:
    a = line.split()
    left = int(a[0])
    right = int(a[1])
    ranges.append((left, right))

# ranges = \
# [[0, 3],
# [1, 3],
# [3, 5],
# [3, 6],]

# ranges = \
# [[0, 3],
# [1, 4],
# [4, 7],
# [5, 8],]

# ranges = \
# [[1, 2],
# [3, 4],]

ORI_LEN = len(ranges)
LEN = len(ranges)
pre_LEN = LEN + 1


# find out intersection
new_ranges = set()
for i in range(LEN):
    for j in range(i + 1, LEN):
        if ranges[i][1] >= ranges[j][0]:
            left = max(ranges[i][0], ranges[j][0])
            right = min(ranges[i][1], ranges[j][1])
            if left <= right:
                new_ranges.add((left, right))


ranges = list(new_ranges)
ranges.sort()

# print("new ranges:")
# print(new_ranges)
# print("ranges:")
# print(ranges)

# find out union
new_ranges = set()
LEN = len(ranges)
for i in range(LEN):
    if ranges[i] == None:
        continue
    left = ranges[i][0]
    right = ranges[i][1]
    for j in range(i + 1,  LEN):
        if ranges[j] == None:
            continue
        
        if ranges[j][0] <= right:
            right = max(right, ranges[j][1])
            ranges[j] = None
        else:
            break
    new_ranges.add((left, right))

ranges = list(new_ranges)
ranges.sort()

# print("ranges:")
# print(ranges)

if len(ranges) == 0:
    print("None")
else:
    for l, r in ranges:
        print(f"{l} {r}")
    
data = [[0, 0] for _ in range(20000)]
while True:
    try:
        a, b = list(map(int, input().split(" ")))
        data[a + 10000][0] += 1
        data[b + 10000][1] += 1
    except Exception as e:
        break
tmp, is_empty = 0, 0
res = []
for i in range(len(data)):
    if tmp <= 1 and tmp + data[i][0] >= 2:
        print(i - 10000, end=" ")
    if tmp + data[i][0] >= 2 and tmp + data[i][0] - data[i][1] <= 1:
        print(i - 10000, end="\n")
        is_empty = 1
    tmp = tmp + data[i][0] - data[i][1]
if is_empty == 0:
    print("None")



全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务