C0180 [2005普及组-B]校门外的树

签到题:
在这里插入图片描述

### NOIP 2005 普及组 P1047 校门外 Python 解法 此问题可以通过模拟的方式解决,即通过数组来表示每棵的状态。初始状态下,所有的都存在,可以用 `1` 表示;当某棵被移除时,则将其状态设置为 `0`。 以下是基于上述思路实现的一个简单解决方案: ```python n, m = map(int, input().split()) trees = [1] * (n + 1) # 初始化木状态,索引从0到n,共n+1棵 for _ in range(m): a, b = map(int, input().split()) for i in range(a, b + 1): # 将[a, b]范围内的标记为已移除 trees[i] = 0 remaining_trees = sum(trees) # 统计剩余未被移除的的数量 print(remaining_trees) ``` 该方法的时间复杂度较高,在最坏情况下可能达到 \(O(n \times m)\),其中 \(n\) 是的总数,\(m\) 是操作次数。这种方法适用于较小的数据规模[^2]。 为了优化性能,可以采用差分数组的思想或者线段等高级数据结构来减少时间复杂度。例如,利用差分数组可以在常数时间内完成区间的更新操作,并最终通过对差分数组求前缀和得到原始数组的状态变化情况[^3]。 #### 差分数组优化版本代码如下: ```python n, m = map(int, input().split()) diff_array = [0] * (n + 2) # 构造差分数组,额外增加一位方便处理边界条件 for _ in range(m): a, b = map(int, input().split()) diff_array[a] -= 1 # 对应位置减去影响值 diff_array[b + 1] += 1 # 下一区间恢复原状 current_sum = 0 # 当前累计和用于计算实际数值 tree_count = n # 初始假设所有都在 for i in range(1, n + 1): # 遍历整个序列并统计剩余数量 current_sum += diff_array[i] if current_sum < 0: # 如果当前累积小于零说明此处无 tree_count -= 1 print(tree_count) ``` 这种算法将每次修改的操作降低到了 \(O(1)\),而最后遍历时只需一次扫描即可得出结果,整体效率显著提升至接近于线性级别 \(O(n+m)\)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值