参考了第一篇题解
subtask#0 5,8,12,13,20WA
#include <bits/stdc++.h>
#define p pair<int, int>
using namespace std;
const int N = 1e5+1;
struct rge{
int a, b;
}plane[N];
int n, m1, m2,ans;
int lst1[N], lst2[N], res1[N], res2[N];
bool cmp(rge& x, rge& y){
if(x.a == y.a){
return x.b < y.b;
}
return x.a < y.a;
}
void work(int k, int* res) {
priority_queue<p, vector<p>, greater<p> > lq;
priority_queue<int, vector<int>, greater<int> > wq;
for(int i = 1; i <= n; i++) {
wq.push(i);
}
for(int i = 1 + k * m1; i <= m1 + k * m2; i++) {
while (!lq.empty()){
if (plane[i].a >= lq.top().first) {
wq.push(lq.top().second);
lq.pop();
}
else break;
}
if (wq.empty()) continue;
int dest = wq.top();
wq.pop();
res[dest]++;
lq.push({plane[i].b, dest});
}
for (int i = 1; i <= n; i++) {
res[i] += res[i - 1];
}
}
int main(){
cin >> n >> m1 >> m2;
for(int i = 1; i <= m1+m2; i++) {
cin >> plane[i].a >> plane[i].b;
}
sort(plane + 1, plane + m1+1, cmp);
sort(plane + m1+2, plane + m1+m2+1, cmp);
work(0, res1);
work(1, res2);
for(int i = 0; i <= n; i++) {
int sum = res1[i] + res2[n-i];
ans = max(ans, sum);
}
cout << ans;
return 0;
}