제출 #1226242

#제출 시각아이디문제언어결과실행 시간메모리
1226242eriksuenderhaufEvent Hopping 2 (JOI21_event2)C++20
100 / 100
171 ms21468 KiB
#include <bits/stdc++.h>
using namespace std;
const int LG = 18;

int main() {
	int n, k; cin >> n >> k;
	vector<int> p(2 * n);
	vector<pair<int, int>> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i].first >> a[i].second;
		p[2 * i] = a[i].first;
		p[2 * i + 1] = a[i].second;
	}
	sort(p.begin(), p.end());
	p.erase(unique(p.begin(), p.end()), p.end());
	int m = (int)p.size();
	vector<vector<int>> jmp(LG, vector<int>(m + 1, m));
	for (int i = 0; i < n; i++) {
		int l = lower_bound(p.begin(), p.end(), a[i].first) - p.begin();
		int r = lower_bound(p.begin(), p.end(), a[i].second) - p.begin();
		a[i] = {l, r};
		jmp[0][l] = min(jmp[0][l], r);
	}
	for (int j = m - 2; j >= 0; j--)
		jmp[0][j] = min(jmp[0][j], jmp[0][j + 1]);
	for (int i = 1; i < LG; i++)
		for (int j = 0; j < m; j++)
			jmp[i][j] = jmp[i - 1][jmp[i - 1][j]];
	auto eval = [&](int l, int r) {
		int res = 0;
		for (int i = LG - 1; i >= 0; i--) {
			if (jmp[i][l] <= r) {
				res += 1 << i;
				l = jmp[i][l];
			}
		}
		return res;
	};

	int cur = eval(0, m - 1);
	if (cur < k) {
		cout << "-1\n";
		return 0;
	}
	set<pair<int, int>> used;
	used.insert({0, 0});
	used.insert({m - 1, m - 1});
	for (int i = 0; i < n; i++) {
		auto it = used.lower_bound({a[i].second, 0});
		int l = prev(it)->second;
		int r = it->first;
		if (a[i].first < l) {
			continue;
		}
		int cnt = cur - eval(l, r) + eval(l, a[i].first) + 1 + eval(a[i].second, r);
		if (cnt >= k) {
			cout << i + 1 << "\n";
			cur = cnt;
			used.insert(a[i]);
		}
		if ((int)used.size() - 2 >= k) {
			break;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...