Submission #386312

#TimeUsernameProblemLanguageResultExecution timeMemory
386312myrcellaEvent Hopping 2 (JOI21_event2)C++17
100 / 100
348 ms34168 KiB
//by szh
#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define pb push_back
#define debug(x) cerr<<#x<<"="<<x<<endl
#define pq priority_queue
#define inf 0x3f
#define rep(i,a,b) for (int i=a;i<(b);i++)
#define MP make_pair
#define SZ(x) (int(x.size()))
#define ll long long
#define mod 1000000007
#define ALL(x) x.begin(),x.end()
void inc(int &a,int b) {a=(a+b)%mod;}
void dec(int &a,int b) {a=(a-b+mod)%mod;}
int lowbit(int x) {return x&(-x);}
ll p0w(ll base,ll p) {ll ret=1;while(p>0){if (p%2ll==1ll) ret=ret*base%mod;base=base*base%mod;p/=2ll;}return ret;}

const int maxn=2e5+10;

int n,m;
map <int,int> mp;
pii seg[maxn];
int suf[maxn],nxt[maxn][20];
vector <int> ans;
set <pii> s;

int solve(int l,int r) {
	int res=0;
	for (int i=19;i>=0;i--) {
		if (nxt[l][i]<=r) {
			res+=(1<<i);
			l=nxt[l][i];
		}
	}
	return res;
}

int main() {
//	freopen("input.txt","r",stdin);	
	std::ios::sync_with_stdio(false);cin.tie();
	cin>>n>>m;
	rep(i,0,n) cin>>seg[i].fi>>seg[i].se,mp[seg[i].fi]=mp[seg[i].se]=1;
	int tot=0;
	for (auto it=mp.begin();it!=mp.end();it++) it->se=tot++;
	memset(suf,inf,sizeof(suf));
	memset(nxt,inf,sizeof(nxt));
	rep(i,0,n) seg[i]=MP(mp[seg[i].fi],mp[seg[i].se]),suf[seg[i].fi]=min(seg[i].se,suf[seg[i].fi]);
	for (int i=tot-1;i>=0;i--) suf[i]=min(suf[i+1],suf[i]);
	for (int i=tot-1;i>=0;i--) {
		nxt[i][0]=suf[i];
		for (int j=1;nxt[i][j-1]<maxn;j++) nxt[i][j]=nxt[nxt[i][j-1]][j-1];
	}
	s.insert(MP(0,tot-1));
	int cur=solve(0,tot-1);
	if (cur<m) {
		cout<<-1;
		return 0;
	}
	rep(i,0,n) {
		int l=seg[i].fi,r=seg[i].se;
		auto it=s.upper_bound(MP(l,mod));
		if (it==s.begin()) continue;
		it--;
		if ((*it).se<r) continue;
		int tmp=cur-solve((*it).fi,(*it).se)+solve((*it).fi,l)+solve(r,(*it).se)+1;
		if (tmp>=m) {
			s.insert(MP((*it).fi,l));
			s.insert(MP(r,(*it).se));
			s.erase(*it);
			cur=tmp;
			ans.pb(i+1);
			if (SZ(ans)==m) break;
		}
	}
	for (int &i:ans) cout<<i<<"\n";
	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...