📜  门|门CS 2010 |第 55 题(1)

📅  最后修改于: 2023-12-03 15:12:47.219000             🧑  作者: Mango

题目介绍

题目名称:门

题目类型:算法

题目来源:门 | 门CS 2010 |第 55 题

难度评级:中等

题目描述:

一个长为n的01序列中有k个区间是连续的1。现在把其中一个1变成0,剩下的1构成的区间的总长度为多少?例如,n=10,k=3。一个可行的01序列是0111110010。如果把第3个1变成0,那么剩下的1构成的区间的长度是2+5=7。

输入格式:

第一行两个整数n和k(1<=n,k<=10^5),表示序列的长度和区间的个数。

接下来k行,每行两个整数l和r(1<=l<=r<=n),表示一个连续的1的区间的左右端点。

输出格式:

一个整数,表示剩下的1构成的区间的总长度。

输入样例:

10 3
2 6
7 7
9 9

输出样例:

7

解题思路

我们可以先通过输入得到原始的01序列,然后遍历连续1序列的左右端点,把最后一个端点的下一位变成0,然后再次遍历原始序列,统计连续的1序列的长度即可。

具体实现细节可以参考下方的代码。

n, k = map(int, input().split())

# 定义一个长度为n的列表表示原始序列
seq = ['0'] * n

# 依次遍历k个连续1序列,将序列中最后一个位置的下一个位置变成0
for i in range(k):
    l, r = map(int, input().split())
    seq[r] = '1'
    if l > 1:
        seq[l-1] = '1'

# 统计剩下的1构成的区间的总长度
cur_len, max_len = 0, 0
for i in range(n):
    if seq[i] == '1':
        cur_len += 1
    else:
        max_len = max(max_len, cur_len)
        cur_len = 0
max_len = max(max_len, cur_len)

print(max_len)

复杂度分析

  • 时间复杂度:$O(n)$,我们需要遍历1次原始序列以及1次连续1序列,每次遍历都需要枚举n个元素。
  • 空间复杂度:$O(n)$,我们需要用一个长度为n的列表来存储原始序列。