Submission #1278093

#TimeUsernameProblemLanguageResultExecution timeMemory
1278093namhhEvent Hopping 2 (JOI21_event2)C++20
100 / 100
375 ms30364 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e5+5;
const int lg = 18;
int n,k,st[N][lg],nxt[N];
pii a[N];
map<int,int>mp;
multiset<pii>s;
void build(){
	for(int i = 1; i <= mp.size(); i++){
	    st[i][0] = nxt[i];
	    if(nxt[i] == 1e9) st[i][0] = 0;
	}
	for(int j = 1; j < lg; j++){
		for(int i = 1; i <= mp.size(); i++) st[i][j] = st[st[i][j-1]][j-1];
	}
}
int jump(int u, int v){
	int sum = 0;
	for(int i = lg-1; i >= 0; i--){
		if(st[u][i] > u && st[u][i] <= v){
			sum += (1 << i);
			u = st[u][i];
		}
	}
	return sum;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> a[i].fi >> a[i].se;
		mp[a[i].fi]++;
		mp[a[i].se]++;
	}
	int cnt = 0;
	for(auto it: mp) mp[it.fi] = ++cnt;
	for(int i = 1; i <= n; i++){
		a[i].fi = mp[a[i].fi];
		a[i].se = mp[a[i].se];
	}
	for(int i = 1; i <= mp.size(); i++) nxt[i] = 1e9;
	for(int i = 1; i <= n; i++) nxt[a[i].fi] = min(nxt[a[i].fi],a[i].se);
	for(int i = mp.size()-1; i >= 1; i--) nxt[i] = min(nxt[i],nxt[i+1]);
	build();
	s.insert({1,1});
	s.insert({mp.size(),mp.size()});
	int cur = jump(1,mp.size());
	if(cur < k){
		cout << -1;
		return 0;
	}
    for(int i = 1; i <= n; i++){
    	auto[x,y] = a[i];
    	auto reze = s.lower_bound({y,-1});
    	auto[x1,x2] = *reze;
    	--reze;
    	auto[y2,y1] = *reze;
    	if(x < y1) continue;
    	int nw = cur+1-jump(y1,x1)+jump(y1,x)+jump(y,x1);
    	if(nw >= k){
    		cur = nw;
    		cout << i << "\n";
    		s.insert({x,y});
		}
		if(s.size() == k+2) return 0;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...