优先队列做的
#include<iostream>
#include<algorithm>
#include<queue>
#define long long int
using namespace std;
int n,m1,m2;
struct air
{
int arr,left;
bool operator<(const air &x) const
{
return left>x.left;
}
}in[1000001],ab[1000001];
priority_queue<air>abroad;
priority_queue<air>inbroad;
int a[10000001],b[10000001];
bool aa[100001],bb[1000001];
int solve1(int x)
{
int cnt=0;
for(int i=1;i<=m1;i++)
{
if(aa[i])continue;
if(!inbroad.empty())
{
if(in[i].arr>inbroad.top().left)
{
inbroad.pop();
inbroad.push(in[i]);
cnt++;
aa[i]=true;
}
else if(inbroad.size()<x)
{
inbroad.push(in[i]);
cnt++;
aa[i]=true;
}
// else return cnt;
}
else
{
inbroad.push(in[i]);
cnt++;
aa[i]=true;
}
}
return cnt;
}
int solve2(int x)
{
int cnt=0;
// cout<<" "<<cnt2<<endl;
for(int i=1;i<=m2;i++)
{
if(bb[i])continue;
if(!abroad.empty())
{
if(ab[i].arr>abroad.top().left)
{
abroad.pop();
abroad.push(ab[i]);
cnt++;
bb[i]=true;
}
else if(abroad.size()<x)
{
abroad.push(ab[i]);
cnt++;
bb[i]=true;
}
// else return cnt;
}
else
{
abroad.push(ab[i]);
cnt++;
bb[i]=true;
}
}
return cnt;
}
bool cmp(air a,air b)
{
return a.arr<b.arr;
}
signed main()
{
cin>>n>>m1>>m2;
for(int i=1;i<=m1;i++)
{
cin>>in[i].arr>>in[i].left;
}
sort(in+1,in+m1+1,cmp);
for(int i=1;i<=m2;i++)
{
cin>>ab[i].arr>>ab[i].left;
}
sort(ab+1,ab+m2+1,cmp);
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+solve1(i);
// cout<<a[i]<<endl;
}
// cout<<endl;
for(int i=1;i<=n;i++)
{
b[i]=b[i-1]+solve2(i);
// cout<<b[i]<<endl;
}
int ans=0;
for(int i=0;i<=n;i++)
{
ans=max(ans,(a[i]+b[n-i]));
}
cout<<ans<<endl;
return 0;
}
测试点#10 #11 #12 #14 #15 #17 #18 #19 #20 #21 #22 TLE