Submission #1253582

#TimeUsernameProblemLanguageResultExecution timeMemory
1253582WH8Event Hopping 2 (JOI21_event2)C++20
0 / 100
73 ms24624 KiB
#include <bits/stdc++.h>

using namespace std;
#define f first
#define s second
#define pb push_back
#define ld long double
#define pll pair<int, int>
#define iii tuple<int,int,int>
#define int long long 
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)

struct seg{
	int l, r, ind;
	seg(int L, int R, int IND): l(L), r(R), ind(IND) {}
	bool operator<(seg const &o) const {
        if (r != o.r) return r < o.r;
        return ind < o.ind;
    }
};

int n,k, cur;
vector<seg> v, sv;
vector<vector<int>> p(100005, vector<int>(20, -1));
set<seg> st;
vector<int> ans;

int mxr(int sind, int r){
	int cur=sind, ret=0;
	//~ printf("sind %lld r %lld\n", sind, r);
	if(v[sind].r > r)return 0;
	for(int k=19;k>=0;k--){
		//~ printf("2^%lld th parent of %lld is %lld\n", k, cur, p[cur][k]);
		if(p[cur][k]==-1 or v[p[cur][k]].r > r)continue;
		ret+=(1<<k);
		cur=p[cur][k];
	}
	return ret;
}

signed main(){
	cin>>n>>k;
	v.push_back(seg(0,0,0));
	sv.push_back(seg(0,0,0));
	for(int i=1;i<=n;i++){
		int l,r;cin>>l>>r;
		v.push_back(seg(l, r, i));
		sv.push_back(seg(l, r, i));
	}
	sort(sv.begin(),sv.end(),[&](auto a,auto b){
		return a.r<b.r;
	});
	stack<seg> s;
	for(int i=0;i<=n;i++){
		while(!s.empty() and s.top().r <= sv[i].l){
			p[s.top().ind][0]=sv[i].ind;
			s.pop();
		}
		s.push(sv[i]);
	}
	//~ for(int i=0;i<=n;i++){
		//~ cout<<i<<": "<<p[i][0]<<endl;
	//~ }
	//~ return 0;
	for(int k=1;k<20;k++){
		for(int i=0;i<=n;i++){
			if(p[i][k-1] != -1)p[i][k]=p[p[i][k-1]][k-1];
		}
	}
	cur=mxr(0, 1e9+5);
	//~ cout<<mxr(1, 1e9+5);
	//~ return 0;
	if(cur < k){
		cout<<-1;
		return 0;
	}
	st.insert(v[0]);
	for(int i=1;i<=n;i++){
		seg key(0, v[i].l, -1);
		auto it=st.lower_bound(key);
		auto prv=prev(it);
		int sind=0, r=1e9+5;
		if (it!=st.end()){
			r=(*it).l;
			if(r < v[i].r)continue;
		}
		sind=(*prv).ind;
		if(v[sind].r > v[i].l) continue;
		
		int rem=mxr(sind, r);
		int nwa=mxr(sind, v[i].l), nwb=mxr(v[i].ind, r);
		//~ printf("v[i].ind %lld, r %lld\n", v[i].ind, r);
		int cand=nwa+nwb+1;
		
		if(cur - rem + cand >= k){
			cur=cur-rem+cand;
			st.insert(v[i]);
			ans.pb(i);
		}	
		//~ printf("i %lld, sind %lld, r %lld, rem %lld, nwa %lld, nwb %lld\n", i, sind, r, rem, nwa, nwb);
	}
	assert(ans.size() >=k);
	for(int i=0;i<k;i++){
		cout<<ans[i]<<"\n";
	}
		
}
/*
5 4
1 10
1 3
3 4
4 5
5 6

*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...