Submission #387020

#TimeUsernameProblemLanguageResultExecution timeMemory
387020ogibogi2004Event Hopping 2 (JOI21_event2)C++14
100 / 100
697 ms50788 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+6;
int n,k;
set<int>s;
int l[MAXN],r[MAXN];
map<int,int>mp;
vector<int>gg[MAXN];
int t[MAXN][20];
int sum=0;
int f(int l,int r)
{
	int cnt=0;
	for(int j=19;j>=0;j--)
	{
		if(t[l][j]<=r)
		{
			cnt+=(1<<j);
			l=t[l][j];
		}
	}
	return cnt;
}
set<pair<int,int> >intervals;
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>l[i]>>r[i];
		s.insert(l[i]);
		s.insert(r[i]);
	}
	int cnt=0;
	for(auto xd:s)
	{
		++cnt;
		mp[xd]=cnt;
	}
	for(int i=1;i<=n;i++)
	{
		l[i]=mp[l[i]];
		r[i]=mp[r[i]];
		gg[l[i]].push_back(r[i]);
	}
	for(int i=0;i<MAXN;i++)t[i][0]=MAXN-1;
	int minr=MAXN-1;
	for(int i=cnt;i>=1;i--)
	{
		for(auto xd:gg[i])minr=min(minr,xd);
		t[i][0]=minr;
	}
	for(int step=1;step<20;step++)
	{
		for(int i=1;i<=cnt;i++)
		{
			t[i][step]=t[t[i][step-1]][step-1];
		//	cout<<i<<" "<<step<<" "<<t[i][step]<<endl;
		}
		t[MAXN-1][step]=MAXN-1;
	}
	intervals.insert({1,cnt});
	sum=f(1,cnt);
	if(sum<k)
	{
		cout<<"-1\n";
		return 0;
	}
	vector<int>output;
	for(int i=1;i<=n;i++)
	{
		auto it=intervals.lower_bound({l[i]+1,r[i]});
		it--;
		//cout<<l[i]<<" "<<r[i]<<" "<<(*it).first<<" "<<(*it).second<<endl;
		if((*it).first>l[i]||(*it).second<r[i])continue;
		//cout<<"?\n";
		int delta=-f((*it).first,(*it).second);
		delta+=f((*it).first,l[i])+f(r[i],(*it).second);
		if(sum+delta>=k-output.size()-1)
		{
			output.push_back(i);
			sum+=delta;
			int l1=(*it).first;
			int r1=(*it).second;
			intervals.erase({l1,r1});
			intervals.insert({l1,l[i]});
			intervals.insert({r[i],r1});
			if(output.size()==k)break;
		}
		//cout<<sum<<endl;
	}
	for(auto xd:output)
	{
		cout<<xd<<endl;
	}
return 0;
}

Compilation message (stderr)

event2.cpp: In function 'int main()':
event2.cpp:79:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |   if(sum+delta>=k-output.size()-1)
      |      ~~~~~~~~~^~~~~~~~~~~~~~~~~~~
event2.cpp:88:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   88 |    if(output.size()==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...