会议室预约冲突(区间合并trick)(TJU保研上机)

会议室预约冲突(区间合并trick)(TJU保研上机)
image

  1. 将每个会议转换为两个事件:
    开始时间 +1
    结束时间 -1

  2. 把所有事件按时间排序:
    时间相同的:开始事件(+1)优先于结束事件(-1)

  3. 扫描所有事件,维护当前同时进行的会议数,更新最大值

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

int n;

void solve(){
    cin >> n;
    vector<pair<int, int>> events;
    for(int i = 0; i < n; ++i){
        int s, t;
        cin >> s >> t;
        events.push_back({s, 1}); // 开始:+1
        events.push_back({t, -1}); // 结束:-1
    }
    // 正确排序逻辑:结束的 (-1) 放前面
    sort(events.begin(), events.end(), [](const pair<int, int>& a, const pair<int, int>& b){
        return a.first == b.first ? a.second < b.second : a.first < b.first;
    });
    
    int maxv = 1, cur = 0;
    for(auto &e : events){
        cur += e.second;
        maxv = max(maxv, cur);
    }

    cout << maxv << "\n";

}

signed main() {
    int _ = 1;
    cin >> _;
    while (_--) {
        solve();
    }
    return 0;
}
posted @ 2025-07-31 23:00  awei040519  阅读(10)  评论(0)    收藏  举报