跳至主要内容

Restaurant Customers

題目

今天有 nn 個人到達與離開餐廳的時間,請問在任意時間點中,餐廳的最多人數是多少?

輸入

第一行有一個正整數 nn

接下來有 nn 行,每行有兩個相異正整數,分別代表第 ii 個顧客到達與離開餐廳的時間。

輸出

輸出一個正整數代表任意時間點中,餐廳的最多人數是多少?

範例測資

Input:
3
5 8
2 4
3 9

Output:
2

alt text

觀察

  1. 數值範圍非常大但真正影響顧客數量的「時間點」很小。
  2. 題目有類似區間加值,僅一次查詢的操作。

本題可以使用「掃描線+差分」的方式解決。

想法

我們僅需關注題目給定的 2n2n 個時間點,因為只有這 2n2n 個時間點會影響人數。

將時間點包裝成 (time,add)(time, add),代表在時間 timetime,加上了 addadd 人(addadd 只會是 111-1),並依照時間點排序。

此時維護目前人數 pp(初始為 00),並依序掃描過每個時間點,根據 addadd 改變 pp,並且每次都確認是否為最大值。

請注意,同個時間點中,addadd1-1 的元素必須在為 11 的元素前面,否則可能會因先加再減,導致誤找到最大值。

範例程式碼

C++ 範例
#include <bits/stdc++.h>
using namespace std;

int n;
int l, r;
vector<pair<int, int>> v;

int main(){

// input
cin >> n;
for (int i=0 ; i<n ; i++){
cin >> l >> r;
v.push_back({l, 1});
v.push_back({r, -1});
}

// process
int p = 0;
int ma = 0;
sort(v.begin(), v.end());
for (auto x : v){
p += x.second;
ma = max(ma, p);
}

// output
cout << ma << "\n";

return 0;
}