如题,哇袄了#14、#16 是堆优化版本。
#include <iostream>
#include <queue>
#include <algorithm>
#define N 114514
#define int long long
using namespace std;
int n, langnum1[N], langnum2[N], ans;
signed main() {
priority_queue < pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > p;
priority_queue < int, vector <int>, greater <int> > unused;
pair <int, int> mm1[N], mm2[N];
ios::sync_with_stdio(0);
int n;
cin >> n;
int m1, m2;
cin >> m1 >> m2;
for (int i = 1; i <= m1; i ++) {
cin >> mm1[i].first >> mm1[i].second;
}
for (int i = 1; i <= m2; i ++) {
cin >> mm2[i].first >> mm2[i].second;
}
sort(mm1 + 1, mm1 + 1 + m1);//没按顺序给
sort(mm2 + 1, mm2 + 1 + m2);//从下面开始都是预处理。预处理0~n个廊桥可以放几个飞机——国内和国际
for (int i = 1; i <= n; i ++) {
unused.push(i);//n个廊桥
}
for (int i = 1; i <= m1; i ++) {
while (p.size() && p.top().first <= mm1[i].first) {
unused.push(p.top().second);
p.pop();//取消已经空掉的廊桥
}
if (not unused.size()) {
continue;//满朝文武竟无一人敢言
}
int tmp = unused.top();//有可以用的
unused.pop();//就腾出来
langnum1[tmp] ++;//有可以被插进队里的飞机了
p.push(make_pair(mm1[i].second, tmp));
}
for (int i = 1; i <= n; i ++) {
langnum1[i] += langnum1[i - 1];//之前满足的,现在也满足
}
while (unused.size()) {
unused.pop();//初始化
}
for (int i = 1; i <= n; i ++) {
unused.push(i);//n个廊桥
}
for (int i = 1; i <= m2; i ++) {
while (p.size() && p.top().first <= mm2[i].first) {
unused.push(p.top().second);
p.pop();//有空的廊桥吗?
}
if (not unused.size()) {
continue;
}
int tmp = unused.top();
unused.pop();
langnum2[tmp] ++;
p.push(make_pair(mm2[i].second, tmp));
}
for (int i = 1; i <= n; i ++) {
langnum2[i] += langnum2[i - 1];
}
for (int i = 0; i <= n; i ++)
{
ans = max(ans, langnum1[i] + langnum2[n - i]);
}
cout << ans << endl;
return 0;
}