#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
inline int rd(){
int x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x;
}
const int N=1e5+2;
int n,m1,m2,num1[N],num2[N],o1=0,o2=0;
struct node{
int l,r;
}a[N],b[N];
bool cmp(const node &p,const node &q){return p.l<q.l;}
bool CMP(const int &p,const int &q){return p>q;}
void solve(node *c,int *num,int tt){
priority_queue<pii,vector<pii>,greater<pii> > q;
priority_queue<int,vector<int>,greater<int> > free;
for(int i=1;i<=n;++i) free.push(i);
for(int i=1;i<=tt;++i){
while(!q.empty()&&q.top().first<c[i].l){
free.push(q.top().second);
q.pop();
}
if(free.empty()) continue;
int id=free.top();
free.pop();
num[id]++;q.push(mp(c[i].r,id));
}
}
int main(){
n=rd(),m1=rd(),m2=rd();
for(int i=1;i<=m1;++i) a[i].l=rd(),a[i].r=rd();
for(int i=1;i<=m2;++i) b[i].l=rd(),b[i].r=rd();
sort(a+1,a+m1+1,cmp);sort(b+1,b+m2+1,cmp);
solve(a,num1,m1);solve(b,num2,m2);
sort(num1+1,num1+n+1,CMP);sort(num2+1,num2+n+1,CMP);
int sum=0;
for(;o1+o2<n;){
if(num1[o1+1]>=num2[o2+1]) sum+=num1[++o1]; //----------------
else sum+=num2[++o2];
if(o1+o2==n) break;
}printf("%d",sum);
return 0;
}
有谁是这么选的最大值吗,请注意“先到先得”这一条件应该如以下这么选:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
inline int rd(){
int x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x;
}
const int N=1e5+2;
int n,m1,m2,num1[N],num2[N];
struct node{
int l,r;
}a[N],b[N];
bool cmp(const node &p,const node &q){return p.l<q.l;}
bool CMP(const int &p,const int &q){return p>q;}
void solve(node *c,int *num,int tt){
priority_queue<pii,vector<pii>,greater<pii> > q;
priority_queue<int,vector<int>,greater<int> > free;
for(int i=1;i<=n;++i) free.push(i);
for(int i=1;i<=tt;++i){
while(!q.empty()&&q.top().first<c[i].l){
free.push(q.top().second);
q.pop();
}
if(free.empty()) continue;
int id=free.top();
free.pop();
num[id]++;q.push(mp(c[i].r,id));
}
for(int i=1;i<=n;++i) num[i]+=num[i-1];
}
int main(){
n=rd(),m1=rd(),m2=rd();
for(int i=1;i<=m1;++i) a[i].l=rd(),a[i].r=rd();
for(int i=1;i<=m2;++i) b[i].l=rd(),b[i].r=rd();
sort(a+1,a+m1+1,cmp);sort(b+1,b+m2+1,cmp);
solve(a,num1,m1);solve(b,num2,m2);
int sum=0;
for(int i=0;i<=n;++i){
sum=max(sum,num1[i]+num2[n-i]); //---------
}printf("%d",sum);
return 0;
}