Submission #655083

#TimeUsernameProblemLanguageResultExecution timeMemory
655083as111학교 설립 (IZhO13_school)C++17
15 / 100
210 ms14976 KiB
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

#define MAXN 300000
#define s second
#define f first

using namespace std;
int cities[MAXN + 1][2];
bool used[MAXN + 1]; // city used or not
vector<pair<int, pair<int, int>>> music;
vector<pair<int, pair<int, int>>> sports;
int N;
int mpos = N - 1;
int spos = N - 1;
void findM() {
	while (used[music[mpos].s.s] && mpos != 0) mpos--;
}
void findS() {
	while (used[sports[spos].s.s]) spos--;
}
int main() {
	int M, S;
	cin >> N >> M >> S;
	for (int i = 0; i < N; i++) {
		cin >> cities[i][0] >> cities[i][1];
		music.push_back(make_pair(cities[i][0], make_pair(cities[i][1], i)));
		sports.push_back(make_pair(cities[i][1], make_pair(cities[i][0], i)));
	}
	sort(music.begin(), music.end());
	sort(sports.begin(), sports.end());
	int ans = 0;
	mpos = N - 1;
	spos = N - 1;
	while (M > 0) {
		used[music[mpos].s.s] = true;
		ans += music[mpos].f;
		findM();
		M--;
	}
	while (S > 0) {
		int pos = sports[spos].s.s;
		if (used[pos]) {
			findM();
			if (cities[pos][1]+music[mpos].f > cities[pos][0]) {
				ans += cities[pos][1] + music[mpos].f - cities[pos][0];
				used[music[mpos].s.s] = true;
				spos--;
				S--;
			}
			else {
				spos--;
			}
		}
		else {
			ans += sports[spos].f;
			used[sports[spos].s.s] = true;
			spos--;
			S--;
		}
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...