Submission #1165833

#TimeUsernameProblemLanguageResultExecution timeMemory
1165833MateiKing80Event Hopping 2 (JOI21_event2)C++20
100 / 100
202 ms28768 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAX_N = 100'000;
constexpr int MAX_logN = 18;
constexpr int MAX_LR = 1'000'000'000;

int N, K;
int L[MAX_N], R[MAX_N];
vector<int> z;

vector<int> invL[MAX_N * 2 + 1];
int doubling[MAX_N * 2 + 1][MAX_logN];
int count(int l, int r) 
{
	int res = 0;
	for (int j = MAX_logN - 1; j >= 0; j--) 
	{
		if (doubling[l][j] <= r) 
		{
			l = doubling[l][j];
			res += 1 << j;
		}
	}
	return res;
}

int main() 
{
	cin >> N >> K;
	for (int i = 0; i < N; i++) 
	{
		cin >> L[i] >> R[i];
		z.push_back(L[i]);
		z.push_back(R[i]);
	}
	sort(z.begin(), z.end());
	z.erase(unique(z.begin(), z.end()), z.end());
	for (int i = 0; i < N; i ++) 
	{
		L[i] = lower_bound(z.begin(), z.end(), L[i]) - z.begin();
		R[i] = lower_bound(z.begin(), z.end(), R[i]) - z.begin();
	}

	for (int i = 0; i < N; i ++) 
		invL[L[i]].push_back(i);
	int r = (int)z.size();
	for (int i = z.size(); i >= 0; i --) 
	{
		for (int j = 0; j < (int)invL[i].size(); j ++) 
			r = min(r, R[invL[i][j]]);
		doubling[i][0] = r;
	}
	for (int i = 1; i < MAX_logN; i ++) 
		for (int j = 0; j <= (int)z.size(); j ++) 
			doubling[j][i] = doubling[doubling[j][i - 1]][i - 1];
	int now = count(0, z.size() - 1);
	
	if (now < K) 
	{
		cout << "-1\n";
		return 0;
	}
	
	set<pair<int, int>> used = {{0, 0}, {z.size() - 1, z.size() - 1}};
	
	for (int i = 0; (int)used.size() - 2 < K; i ++) 
	{
		int st = prev(used.lower_bound({R[i], 0}))->second;
		int dr = used.lower_bound({R[i], 0})->first;
		if (L[i] < st) 
			continue;
		int tmp = now - count(st, dr) + count(st, L[i]) + 1 + count(R[i], dr);
		if (tmp >= K) 
		{
			cout << i + 1 << '\n';	
			now = tmp;
			used.insert({L[i], R[i]});
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...