📅  最后修改于: 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)