三分 #1本地可过,评测机显示read3, excepted 7
查看原帖
三分 #1本地可过,评测机显示read3, excepted 7
1081824
LoveFrieren楼主2024/10/17 14:40

三分+priority_queue 代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
typedef pair<int, int> pii;
int n, m1, m2, ans = -1;
priority_queue<int, vector<int>, greater<int> > nlq, jlq;
pii gn[M], gj[M];
int read() {
	int f = 1, a = 0;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') f = -1;
		c = getchar(); 
	}
	while(c >= '0' && c <= '9'){
		a = (a << 1) + (a << 3) + (c ^ 48);
		c = getchar();
	}
	return f * a;
}
int check(int i) {
	int gnnum = 0, gjnum = 0;
	while(!nlq.empty()) nlq.pop();
	while(!jlq.empty()) jlq.pop();
	for(int j = 1; j <= m1; ++j) {
			if(nlq.size() < i) {
			nlq.push(gn[j].second);
			++gnnum;
		}
		else if(!nlq.empty() && gn[j].first > nlq.top()){
			nlq.pop(), nlq.push(gn[j].second);
			++gnnum;
		}
	}
	for(int j = 1; j <= m2; ++j) {
		if(jlq.size() < (n - i)) {
			jlq.push(gj[j].second);
			++gjnum;
		}
		else if(!jlq.empty() && gj[j].first> jlq.top()){
			jlq.pop(), jlq.push(gj[j].second);
			++gjnum;
		}
	}
	return (gjnum + gnnum);
}
int main() {
	n = read(), m1 = read(), m2 = read();
	for(int i = 1; i <= m1; ++i)
		gn[i].first = read(), gn[i].second = read();
	for(int i = 1; i <= m2; ++i) 
		gj[i].first = read(), gj[i].second = read();
	sort(gn + 1, gn + m1 + 1);
	sort(gj + 1, gj + m2 + 1);
//	for(int i = 0; i <= n; ++i) cout << i << ' ' << check(i) << endl;
	int l = 0, r = n + 1, lans, rans;
	while(r - l > 1) {
		int lmid = l + (r - l) * (1.0 / 3);
		int rmid = l + (r - l) * (2.0 / 3);
		lans = check(lmid), rans = check(rmid);
//		printf("l:%d r:%d lmid:%d rmid:%d lans:%d rans:%d\n", l, r, lmid, rmid, lans, rans); 
		if(lans > rans) r = rmid;
		else l = lmid + 1; 
	}
	if(r <= n)
		ans = max(check(l), check(r));
	else ans = check(l);
	printf("%d", ans);
	return 0;
}
2024/10/17 14:40
加载中...