真·百行代码(整整100行):
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a1[N],b1[N],f1[2*N],ans1[N],asw1[N],a2[N],b2[N],f2[2*N],ans2[N],asw2[N];
int n,m1,m2;
priority_queue<int,vector<int>,greater<int> > pq1,pq2,p1,p2;
map<int,pair<int,bool> > mp1,mp2;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m1>>m2;
for(int i=1;i<=m1;i++)
{
cin>>a1[i]>>b1[i];
mp1[a1[i]]={i,0};
mp1[b1[i]]={i,1};
pq1.push(a1[i]);
pq1.push(b1[i]);
}
for(int i=1;i<=2*m1;i++)
{
f1[i]=pq1.top();
pq1.pop();
}
int Now1=0;
for(int i=1;i<=2*m1;i++)
{
if(mp1[f1[i]].second==0)
{
if(p1.empty()||p1.top()>Now1+1)
{
ans1[mp1[f1[i]].first]=Now1+1;
}
else
{
ans1[mp1[f1[i]].first]=p1.top();
p1.pop();
}
++Now1;
}
else
{
p1.push(ans1[mp1[f1[i]].first]);
Now1--;
}
}
for(int i=1;i<=m1;i++)
{
asw1[ans1[i]]++;
}
for(int i=1;i<=m1;i++)
{
asw1[i]+=asw1[i-1];
}
for(int i=1;i<=m2;i++)
{
cin>>a2[i]>>b2[i];
mp2[a2[i]]={i,0};
mp2[b2[i]]={i,1};
pq2.push(a2[i]);
pq2.push(b2[i]);
}
for(int i=1;i<=2*m2;i++)
{
f2[i]=pq2.top();
pq2.pop();
}
int Now2=0;
for(int i=1;i<=2*m2;i++)
{
if(mp2[f2[i]].second==0)
{
if(p2.empty()||p2.top()>Now2+1)
{
ans2[mp2[f2[i]].first]=Now2+1;
}
else
{
ans2[mp2[f2[i]].first]=p2.top();
p2.pop();
}
++Now2;
}
else
{
p2.push(ans2[mp2[f2[i]].first]);
Now2--;
}
}
for(int i=1;i<=m2;i++)
asw2[ans2[i]]++;
for(int i=1;i<=m2;i++)
asw2[i]+=asw2[i-1];
int ANS=-114514;
for(int i=0;i<=n;i++)
ANS=max(ANS,asw1[i]+asw2[n-i]);
cout<<ANS;
return 0;
}
锰锌求dalao指教~