90pts求调
查看原帖
90pts求调
807221
xiaopig114514楼主2024/10/21 22:29

如题,哇袄了#14、#16 是堆优化版本。

#include <iostream>
#include <queue>
#include <algorithm>
#define N 114514
#define int long long
using namespace std;
int n, langnum1[N], langnum2[N], ans;
signed main() {
	priority_queue < pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > p;
	priority_queue < int, vector <int>, greater <int> > unused;
	pair <int, int> mm1[N], mm2[N];
	ios::sync_with_stdio(0);
	int n;
	cin >> n;
	int m1, m2;
	cin >> m1 >> m2;
	for (int i = 1; i <= m1; i ++) {
		cin >> mm1[i].first >> mm1[i].second;
	}
	for (int i = 1; i <= m2; i ++) {
		cin >> mm2[i].first >> mm2[i].second;
	}
	sort(mm1 + 1, mm1 + 1 + m1);//没按顺序给
	sort(mm2 + 1, mm2 + 1 + m2);//从下面开始都是预处理。预处理0~n个廊桥可以放几个飞机——国内和国际
	for (int i = 1; i <= n; i ++) {
		unused.push(i);//n个廊桥
	}
	for (int i = 1; i <= m1; i ++) {
		while (p.size() && p.top().first <= mm1[i].first) {
			unused.push(p.top().second);
			p.pop();//取消已经空掉的廊桥
		}
		if (not unused.size()) {
			continue;//满朝文武竟无一人敢言
		}
		int tmp = unused.top();//有可以用的
		unused.pop();//就腾出来
		langnum1[tmp] ++;//有可以被插进队里的飞机了
		p.push(make_pair(mm1[i].second, tmp));
	}
	for (int i = 1; i <= n; i ++) {
		langnum1[i] += langnum1[i - 1];//之前满足的,现在也满足
	}
	while (unused.size()) {
		unused.pop();//初始化
	}
	for (int i = 1; i <= n; i ++) {
		unused.push(i);//n个廊桥
	}
	for (int i = 1; i <= m2; i ++) {
		while (p.size() && p.top().first <= mm2[i].first) {
			unused.push(p.top().second);
			p.pop();//有空的廊桥吗?
		}
		if (not unused.size()) {
			continue;
		}
		int tmp = unused.top();
		unused.pop();
		langnum2[tmp] ++;
		p.push(make_pair(mm2[i].second, tmp));
	}
	for (int i = 1; i <= n; i ++) {
		langnum2[i] += langnum2[i - 1];
	}
	for (int i = 0; i <= n; i ++) 
	{
		ans = max(ans, langnum1[i] + langnum2[n - i]);
	}
	cout << ans << endl;
	return 0;
}
2024/10/21 22:29
加载中...