# APCS實作題2026年3月中高級第2題:觀光旅遊 > 日期:2026年3月11日 > 作者:王一哲 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=s180) ## 題目 ### 問題描述 某旅行社正準備接待 $n$ 個不同的旅行團。第 $i$ 個旅行團預計在第 $t_i$ 天抵達觀光景點。 當地共有 $m$ 個表演,第 $j$ 個表演的演出期間是從第 $s_j$ 天到第 $e_j$ 天(包含首尾兩天),且每天都會演出一場。為了確保遊客體驗,景點保證:**在同一天內,任何兩個不同的表演演出時間都不會重疊**。這意味著如果一個旅行團在第 $t_i$ 天在場,且當天有多個表演正在展演期內,該團可以看完當天所有的表演。 如果第 $i$ 團旅行團的抵達日期 $t_i$ 滿足 $s_j \leq t_i \leq e_j$,則該團可以觀看第 $j$ 個表演。旅行社想要計算這 $n$ 團旅行團總共最多可以看多少場表演(即:將每個旅行團能看到的表演數量加總)。 例如有 $3$ 組旅行團抵達時間為 $7, 5, 10$,總共有 $5$ 種表演時間分別為 $(2, 5), (3, 9), (7, 8), (4, 6), (5, 6)$。 第 $1$ 組旅行團可以看編號為 $2, 3$ 共 $2$ 場表演。 第 $2$ 組旅行團可以看編號為 $1, 2, 4, 5$ 共 $4$ 場表演。 第 $3$ 組旅行團沒有任何表演可以看。 這 $4$ 組旅行團總共可以看 $6$ 場表演。 <br /> ### 輸入說明 第一行包含兩個整數 $n$ 和 $m$ ($1 \leq n, m \leq 10^5$),分別代表旅行團的數量與表演的數量。 第二行包含 $n$ 個整數 $t_1, t_2, \dots, t_n$ ($1 \leq t_i \leq 10^8$),代表每個旅行團抵達的日期。 接下來的 $m$ 行,每行包含兩個整數 $s_j$ 和 $e_j$ ($1 \leq s_j \leq e_j \leq 10^8$),代表第 $j$ 個表演的開始與結束日期。 配分 - 40分:$1 \leq n, m \leq 10^3$ - 60分:無限制。 <br /> ### 輸出格式 對於每個詢問,輸出一行包含一個整數 $k$,即滿足條件的分割點索引。 <br /> ### 範例輸入1 ``` 3 5 7 5 10 2 5 3 9 7 8 4 6 5 6 ``` ### 範例輸出1 ``` 6 ``` ### 範例輸入2 ``` 12 15 11 4 2 13 6 7 1 19 9 8 20 16 5 21 1 16 11 29 11 20 3 29 18 26 15 26 1 19 22 23 2 8 7 11 2 10 22 29 10 28 18 27 ``` ### 範例輸出2 ``` 77 ``` <br /> ## Python 程式碼 只要抵達日期 $t_i$ 滿足 $s_j \leq t_i \leq e_j$ 就可以看第 $j$ 場表演,因此我將 $s_j$、$t_i$、$e_j$ 後面分別接上 $0, 1, 2$,將 $(s_j, 0), (t_i, 1), (e_j, 2)$ 存入串列 $time$ 再由小到大排序。接下來用變數 $curr$ 儲存目前的表演數量,用 $ans$ 儲存可以看到的表演數量;依序讀取 $time$ 的資料 $t, op$,如果 $op = 1$ 則 $curr$ 加 1;如果 $op = 2$ 則 $ans$ 加 $curr$;如果 $op = 3$ 則 $curr$ 減 1。費時最久約為 0.3 s,使用記憶體最多約為 41.6 MB,通過測試。 ```python= n, m = map(int, input().split()) time = [] # (start, 1), (end, 3), (arrive, 2) for a in map(int, input().split()): time.append((a, 2)) for _ in range(m): start, end = map(int, input().split()) time.append((start, 1)) time.append((end, 3)) time.sort() ans = 0 curr = 0 for t, op in time: if op == 1: curr += 1 elif op == 2: ans += curr elif op == 3: curr -= 1 print(ans) ``` <br /><br /> ## C++ 程式碼 費時最久約為 36 ms,使用記憶體最多約為 12.9 MB,通過測試。 ```cpp= #include <cstdio> #include <vector> #include <utility> #include <algorithm> using namespace std; int main() { long n, m; scanf("%ld %ld", &n, &m); vector<pair<long, long>> time; // (start, 1), (end, 3), (arrive, 2) for(long i=0; i<n; i++) { long a; scanf("%ld", &a); time.push_back(make_pair(a, 2)); } for(long i=0; i<m; i++) { long start, end; scanf("%ld %ld", &start, &end); time.push_back(make_pair(start, 1)); time.push_back(make_pair(end, 3)); } sort(time.begin(), time.end()); long ans = 0, curr = 0; for(auto it : time) { long op = it.second; if (op == 1) curr++; else if (op == 2) ans += curr; else if (op == 3) curr--; } printf("%ld\n", ans); return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`Python`、`C++`