会议室预约冲突(区间合并trick)(TJU保研上机)
-
将每个会议转换为两个事件:
开始时间 +1
结束时间 -1 -
把所有事件按时间排序:
时间相同的:开始事件(+1)优先于结束事件(-1) -
扫描所有事件,维护当前同时进行的会议数,更新最大值
#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;
}


浙公网安备 33010602011771号