公式

C - 会議室の混雑 / Conference Room Congestion 解説 by MMNMM


この問題は、イベントソートを使って解くことができます。

次の \(2\) 種類の出来事を考えます。

  • 時刻 \(T\) に会議が開始する。
  • 時刻 \(T\) に会議が終了する。

これらを時刻 \(T\) の昇順に並べ、現在いくつの会議が行われているかを管理しながら出来事を処理すればよいです。 会議が行われる時間は右半開区間となっているので、同じ時刻の会議開始と会議終了では、会議終了のほうを先に処理する必要があることに注意してください。

実装例は以下のようになります。

#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>
using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    // 出来事の (時間, 開始か終了か) の組
    vector<pair<int, int>> event;
    for (int i = 0; i < N; ++i) {
        int S, E;
        cin >> S >> E;
        event.emplace_back(S, 1);
        event.emplace_back(E, -1);
    }

    // 時間でソート
    ranges::sort(event);

    // 現在行われている会議の数
    int now_reservation = 0;
    for (auto type : event | views::values) { // 時間の昇順に種類を見て
        now_reservation += type; // 会議の数を更新
        if (now_reservation == K) { // K 個行われていたら
            cout << "Yes" << endl; // Yes を出力
            return 0;
        }
    }
    cout << "No" << endl;
    return 0;
}
N, K = map(int, input().split())

# 出来事の (時間, 開始か終了か) の組
event = []
for i in range(N):
    S, E = map(int, input().split())
    event.append((S, 1))
    event.append((E, -1))

# 時間でソート
event.sort()

# 現在行われている会議の数
now_reservation = 0
for _, type in event: # 時間の昇順に種類を見て
    now_reservation += type # 会議の数を更新
    if now_reservation == K: # K 個行われていたら
        print('Yes') # Yes を出力
        break
else:
    print('No')

投稿日時:
最終更新: