#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n,m1,m2;
struct gn{
int a,b;
}f1[100005];
struct gw{
int a,b;
}f2[100005];
bool cmp(gn x,gn y){
return x.a<y.a;
}
bool cmp2(gw x,gw y){
return x.a<y.a;
}
int k1,ln[100005],res[100005];
void lqfp(){
priority_queue<pair<int,int> > lq;
priority_queue<pair<int,int> > lq2;
lq.push(make_pair(-f1[1].b,1));k1=1;
ln[1]++;
for(int i=2;i<=m1;i++){
int x=-lq.top().first,y=1e9;
if(x<f1[i].a){
while(x<f1[i].a&&!lq.empty()){
x=-lq.top().first;
if(x>=f1[i].a) break;
lq2.push(lq.top());
y=min(y,lq.top().second);
lq.pop();
}
ln[y]++;
lq.push(make_pair(-f1[i].b,y));
while(!lq2.empty()){
if(lq2.top().second==y){
lq2.pop();
continue;
}
lq.push(lq2.top());
lq2.pop();
}
}
else{
ln[++k1]++;
lq.push(make_pair(-f1[i].b,k1));
}
}
for(int i=1;i<=n;i++){
if(i>k1){
res[i]=res[k1];
continue;
}
res[i]=res[i-1]+ln[i];
}
return;
}
int k2,lw[100005],ans[100005];
void lqfp2(){
priority_queue<pair<int,int> > lq;
priority_queue<pair<int,int> > lq2;
lq.push(make_pair(-f2[1].b,1));k2=1;
lw[1]++;
for(int i=2;i<=m2;i++){
int x=-lq.top().first,y=1e9;
if(x<f2[i].a){
while(x<f2[i].a&&!lq.empty()){
x=-lq.top().first;
if(x>=f2[i].a) break;
lq2.push(lq.top());
y=min(y,lq.top().second);
lq.pop();
}
lw[y]++;
lq.push(make_pair(-f2[i].b,y));
while(!lq2.empty()){
if(lq2.top().second==y){
lq2.pop();
continue;
}
lq.push(lq2.top());
lq2.pop();
}
}
else{
lw[++k2]++;
lq.push(make_pair(-f2[i].b,k2));
}
}
for(int i=1;i<=n;i++){
if(i>k2){
ans[i]=ans[k2];
continue;
}
ans[i]=ans[i-1]+lw[i];
}
return;
}
int zans=0;
int main(){
// freopen("std.out","r",stdin);
n=read(),m1=read(),m2=read();
for(int i=1;i<=m1;i++)
f1[i].a=read(),f1[i].b=read();
for(int i=1;i<=m2;i++)
f2[i].a=read(),f2[i].b=read();
sort(f1+1,f1+m1+1,cmp);sort(f2+1,f2+m2+1,cmp2);
lqfp();lqfp2();
for(int i=0;i<=n;i++){
int sum1=i,sum2=n-i;
zans=max(zans,res[sum1]+ans[sum2]);
}
printf("%d\n",zans);
return 0;
}
思路大概是从前往后先算出这个飞机应该停在哪个廊桥
然后做操作
本地测1e5数据大概在0.8s到3s之间,求优化!