35pt的原因
查看原帖
35pt的原因
751546
wenyutao1楼主2023/10/20 10:41
#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;
}
2023/10/20 10:41
加载中...