Code in C++
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 100005
#define dMAX(a, b) ((a) > (b) ? (a) : (b))
#define dMIN(a, b) ((a) < (b) ? (a) : (b))
struct Airline
{
int ari;
int lea;
bool inline operator>(const Airline &) const;
bool inline operator<(const Airline &) const;
};
struct CnvBridge
{
int due;
int cnt;
CnvBridge(const int &a = 0, const int &b = 0) : due(a), cnt(b) {}
};
int n, m1, m2;
Airline dom_f[MAXN], for_f[MAXN];
CnvBridge dom_b[MAXN], for_b[MAXN];
int dom_sum[MAXN], for_sum[MAXN];
void input();
void solve();
int read();
int main()
{
freopen("P7913_9.in", "r", stdin);
input();
solve();
dom_sum[0] = 0, for_sum[0] = 0;
for (int i = 1; i <= m1; i++)
dom_sum[i] = dom_sum[i - 1] + dom_b[i - 1].cnt;
for (int i = 1; i <= m2; i++)
for_sum[i] = for_sum[i - 1] + for_b[i - 1].cnt;
int ans = 0;
for (int i = 0; i <= n; i++)
ans = dMAX(ans, dom_sum[i] + for_sum[n - i]);
cout << ans << endl;
return 0;
}
void solve()
{
sort(dom_f, dom_f + m1);
sort(for_f, for_f + m2);
for (int i = 0; i < m1; i++)
for (int j = 0;; j++)
{
CnvBridge &cb = dom_b[j];
if (cb.due < dom_f[i].ari)
{
cb.due = dom_f[i].lea, cb.cnt++;
break;
}
}
for (int i = 0; i < m2; i++)
for (int j = 0;; j++)
{
CnvBridge &cb = for_b[j];
if (cb.due < for_f[i].ari)
{
cb.due = for_f[i].lea, cb.cnt++;
break;
}
}
}
void input()
{
n = read(), m1 = read(), m2 = read();
for (int i = 0; i < m1; i++)
dom_f[i].ari = read(), dom_f[i].lea = read();
for (int i = 0; i < m2; i++)
for_f[i].ari = read(), for_f[i].lea = read();
}
bool inline Airline::operator>(const Airline &a) const
{
return this->ari > a.ari;
}
bool inline Airline::operator<(const Airline &a) const
{
return this->ari < a.ari;
}
inline int read()
{
int f = 1, r = 0;
char c = getchar();
while (!isdigit(c))
f ^= c == '-', c = getchar();
while (isdigit(c))
r = (r << 1) + (r << 3) + (c & 15), c = getchar();
return f ? r : -r;
}
