75pts求调
查看原帖
75pts求调
1092500
cnpdz楼主2024/10/19 17:12

参考了第一篇题解

subtask#0 5,8,12,13,20WA

#include <bits/stdc++.h>
#define p pair<int, int>

using namespace std;

const int N = 1e5+1;

struct rge{
	int a, b;
}plane[N];

int n, m1, m2,ans;
int lst1[N], lst2[N], res1[N], res2[N];

bool cmp(rge& x, rge& y){
	if(x.a == y.a){
		return x.b < y.b;
	}
	return x.a < y.a;
}

void work(int k, int* res) {
	priority_queue<p, vector<p>, greater<p> > lq; // 等待离港飞机队列
	priority_queue<int, vector<int>, greater<int> > wq; // 可用廊桥队列
	for(int i = 1; i <= n; i++) {
		wq.push(i);
	}
	for(int i = 1 + k * m1; i <= m1 + k * m2; i++) {
		while (!lq.empty()){
			if (plane[i].a >= lq.top().first) {
				wq.push(lq.top().second);
				lq.pop();
			} // 在第i架飞机入港时 哪些之前停靠的飞机已经离开 将它们之前所占用的廊桥变为可用状态
			else break;
		}
		if (wq.empty()) continue; // 贪心最小的可用廊桥
		int dest = wq.top();
		wq.pop();
		res[dest]++; // 累加第dest个廊桥能提供飞机停靠的数量
		lq.push({plane[i].b, dest}); // 等待离港
	}
	for (int i = 1; i <= n; i++) {
		res[i] += res[i - 1];
	}
}

int main(){
	cin >> n >> m1 >> m2;
	for(int i = 1; i <= m1+m2; i++) {
		cin >> plane[i].a >> plane[i].b;
	}
	sort(plane + 1, plane + m1+1, cmp);
	sort(plane + m1+2, plane + m1+m2+1, cmp);

	work(0, res1);
	work(1, res2);

	for(int i = 0; i <= n; i++) {
		int sum = res1[i] + res2[n-i];
		ans = max(ans, sum);
	}
	cout << ans;
	return 0;
}
//1<=n<=1e5,m1+m2<=1e5
2024/10/19 17:12
加载中...