三分+priority_queue 代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
typedef pair<int, int> pii;
int n, m1, m2, ans = -1;
priority_queue<int, vector<int>, greater<int> > nlq, jlq;
pii gn[M], gj[M];
int read() {
int f = 1, a = 0;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
a = (a << 1) + (a << 3) + (c ^ 48);
c = getchar();
}
return f * a;
}
int check(int i) {
int gnnum = 0, gjnum = 0;
while(!nlq.empty()) nlq.pop();
while(!jlq.empty()) jlq.pop();
for(int j = 1; j <= m1; ++j) {
if(nlq.size() < i) {
nlq.push(gn[j].second);
++gnnum;
}
else if(!nlq.empty() && gn[j].first > nlq.top()){
nlq.pop(), nlq.push(gn[j].second);
++gnnum;
}
}
for(int j = 1; j <= m2; ++j) {
if(jlq.size() < (n - i)) {
jlq.push(gj[j].second);
++gjnum;
}
else if(!jlq.empty() && gj[j].first> jlq.top()){
jlq.pop(), jlq.push(gj[j].second);
++gjnum;
}
}
return (gjnum + gnnum);
}
int main() {
n = read(), m1 = read(), m2 = read();
for(int i = 1; i <= m1; ++i)
gn[i].first = read(), gn[i].second = read();
for(int i = 1; i <= m2; ++i)
gj[i].first = read(), gj[i].second = read();
sort(gn + 1, gn + m1 + 1);
sort(gj + 1, gj + m2 + 1);
// for(int i = 0; i <= n; ++i) cout << i << ' ' << check(i) << endl;
int l = 0, r = n + 1, lans, rans;
while(r - l > 1) {
int lmid = l + (r - l) * (1.0 / 3);
int rmid = l + (r - l) * (2.0 / 3);
lans = check(lmid), rans = check(rmid);
// printf("l:%d r:%d lmid:%d rmid:%d lans:%d rans:%d\n", l, r, lmid, rmid, lans, rans);
if(lans > rans) r = rmid;
else l = lmid + 1;
}
if(r <= n)
ans = max(check(l), check(r));
else ans = check(l);
printf("%d", ans);
return 0;
}