40分求调
  • 板块P1752 点菜
  • 楼主Riptide65536
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/3 15:50
  • 上次更新2025/2/3 20:57:35
查看原帖
40分求调
1106969
Riptide65536楼主2025/2/3 15:50
#include <bits/stdc++.h>
using namespace std;

int n, m, p, q;
struct dish{
	int deli, price;
}a[200002];

int pDown[50005], qUp[50005];

bool comp1(dish a, dish b){
	return a.deli > b.deli;
}

struct comp2{
	bool operator()(dish a, dish b){
		return a.price < b.price;
	}
};

priority_queue<dish, vector<dish> , comp2> qu;

bool check(int weeks){
	// p个挑剔的人,q个穷的人,其余正常人 
	
	// Step 0:预处理
	if((long long)((n-p-q)*weeks) >= m) return true;
	while(!qu.empty()) qu.pop(); 
	
	// Step 1:筛掉挑剔的人
	int now = 0;
	for(int i=0; i<p; i++){
		for(int j=0; j<weeks; j++){
			if(now<m && a[now].deli >= pDown[i])
				now++;
			else break;
		}
	}
	
	for(int i=now; i<m; i++){
		qu.push(a[i]);
	}
	
	// Step 2:筛掉穷人 
	for(int i=0; i<q; i++){
		for(int j=0; j<weeks; j++){
			if(!qu.empty() && a[now].price <= qUp[i])
				qu.pop();
			else break;
		}
	}
	
	// Step 3:计算剩余的人是否可以拿完
	int remants = qu.size();
	return (long long)((n-p-q)*weeks) >= remants;
}

int ans = -1;
int search(int left, int right){
	int mid;
	while(right > left + 1){
		mid = (left + right) / 2;
		if(check(mid)){
			ans = mid;
			right = mid;
		}
		else{
			left = mid;
		}
	}
	return right;
}


signed main(){
	cin >> n >> m >> p >> q;
	for(int i=0; i<m; i++){
		cin >> a[i].deli >> a[i].price;
	}
	for(int i=0; i<p; i++){
		cin >> pDown[i];
	}
	for(int i=0; i<q; i++){
		cin >> qUp[i];
	}
	
	sort(a, a+m, comp1);
	sort(pDown, pDown+p, greater<int>());
	sort(qUp, qUp+q);
	
	search(0, m+1);
	cout << ans;
	
	return 0;
}
2025/2/3 15:50
加载中...