6个点超时
#include<bits/stdc++.h>
#define N 100001
using namespace std;
//假设廊桥有无数个
//对于每个区域,每个廊桥所停靠的飞机是固定的
//将每个区域第几个廊桥能接待飞机数量求出后,
//算出两个区域各分几个廊桥使得接待的飞机数量最多
//用数组记录每个廊桥接待的飞机数
struct node//飞机
{
int arr;//降落时间
int lea;//起飞时间
};
struct air//廊桥里的飞机
{
int lea;//起飞时间
int num;//廊桥编号
};
bool operator < (air n1, air n2)
{
return n1.lea > n2.lea;
}
int n, m1, m2;
node a[N], b[N];
int x[N], y[N];//记录每个区域每个廊桥接待的飞机数
bool cmp(node n1, node n2)
{
return n1.arr < n2.arr;
}
void input()
{
cin >> n >> m1 >> m2;
for(int i = 1; i <= m1; i++)
{
cin >> a[i].arr >> a[i].lea;
}
for(int i = 1; i <= m2; i++)
{
cin >> b[i].arr >> b[i].lea;
}
}
void init()
{
sort(a + 1, a + m1 + 1, cmp);
sort(b + 1, b + m2 + 1, cmp);
}
void calcua()
{
priority_queue<int, vector<int>, greater<int> > qk;//空廊桥编号优先队列,小顶堆
priority_queue<air> q;//停飞机的优先队列
air u;
int num = 1;//已用廊桥个数
int zuixiao = 1000000;//目前第一个空廊桥
for(int i = 1; i <= m1; i++)
{
//1.这架飞机到达之前的所有飞机起飞
while(!q.empty() && q.top().lea < a[i].arr)
{
u = q.top();
q.pop();
qk.push(u.num);
}
//2.在空廊桥优先队列中找第一个空廊桥
if(qk.empty())//廊桥都停了飞机
{
zuixiao = num++;//新建廊桥
}
else
{
zuixiao = qk.top();//第一个空廊桥
qk.pop();
}
//到这里已经找出最小廊桥编号
if(zuixiao > n)//目前廊桥数量已经比规定的多
{
continue;
}
//3.把第i架飞机停进去
u.lea = a[i].lea;
u.num = zuixiao;
q.push(u);
//4.记录廊桥接待的飞机数量
x[zuixiao]++;
}
}
void calcub()
{
priority_queue<int, vector<int>, greater<int> > qk;//空廊桥优先队列,小顶堆
priority_queue<air> q;//停飞机的优先队列
air u;
int num = 1;//已用廊桥个数
int zuixiao = 1000000;//目前第一个空廊桥
for(int i = 1; i <= m2; i++)
{
//1.这架飞机到达之前的所有飞机起飞
while(!q.empty() && q.top().lea < b[i].arr)
{
u = q.top();
q.pop();
qk.push(u.num);
}
//2.在空廊桥优先队列中找第一个空廊桥
if(qk.empty())//廊桥都停了飞机
{
zuixiao = num++;//新建廊桥
}
else
{
zuixiao = qk.top();//第一个空廊桥
qk.pop();
}
//到这里已经找出最小廊桥编号
if(zuixiao > n)//目前廊桥数量已经比规定的多
{
continue;
}
//3.把第i架飞机停进去
u.lea = b[i].lea;
u.num = zuixiao;
q.push(u);
//4.记录廊桥接待的飞机数量
y[zuixiao]++;
}
}
void testout()
{
int maxn = -1;
for(int i = 0; i <= n; i++)//枚举每个区域廊桥个数
{
//i个是国内,n-i个是国外
int sum = 0;
for(int j = 1; j <= i; j++)
{
sum += x[j];
}
for(int j = 1; j <= n - i; j++)
{
sum += y[j];
}
maxn = max(maxn, sum);
}
cout << maxn;
}
int main()
{
input();
init();
calcua();
calcub();
testout();
return 0;
}