# Array# Greedy# Iteration

f339 - 3.下雪的日子(Snow)

🔗 前往 ZeroJudge 原題

題目描述

題目給定道路總長度 N 和暢通道路區間的資訊,要求找出所有被雪覆蓋的道路區間,並按照區間左界由小到大輸出。

解題思路

這題的核心思想是遍歷整個道路,並利用一個布林陣列 a 記錄每個路段是否暢通。對於每個被雪覆蓋的區間,找到連續的被覆蓋路段,並輸出其左右端點。使用貪心策略,每次從當前位置開始尋找下一個連續的暢通路段,並輸出中間的被覆蓋路段。

複雜度分析

  • 時間複雜度: O(N + M),其中 N 是道路總長度,M 是暢通道路區間的數量。遍歷道路需要 O(N) 時間,處理每個暢通區間需要 O(M) 時間。
  • 空間複雜度: O(N),主要用於儲存布林陣列 a,記錄每個路段是否暢通。

程式碼

#include <iostream>
using namespace std;
bool a[100001];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n,m,x,y,s=0;
	cin >> n >> m;
	while(m--){
		cin >> x >> y;
		for(int i=x;i<y;++i)
			a[i]=1;
	}
	while(s<n){
		int k=s;
		while(a[k]==0&&k<n)
			++k;
		if(k!=s)
			cout << s << " " << k << "\n"; 
		s=max(s+1,k);
	}
}

Discussion