Submission #1228948

#TimeUsernameProblemLanguageResultExecution timeMemory
1228948_rain_Event Hopping (BOI22_events)C++20
20 / 100
93 ms17088 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)1e5;
const int INF=(int)1e9;
	int s[N+2],e[N+2],l[N+2],r[N+2];
	int n,q,limit_size;
	vector<int>pp;
	vector<int>nen;
	

int Find(int x){
	return upper_bound(nen.begin(),nen.end(),x)-nen.begin();
}

namespace subtask2{
	bool check(){
		return n<=5000;
	}

	vector<pair<int,int>>quest[N+2];
	vector<int>toado[N+2];
	int ans[N+2];

	void main_code(){
		for(int i=1;i<=q;++i) {
			if (l[i]==r[i]){
				ans[i]=0;
				continue;
			}
			if (e[l[i]]>e[r[i]]){
				ans[i]=INF;
				continue;
			}
			quest[l[i]].push_back({r[i],i});
		}
		for(int i=1;i<=n;++i) toado[e[i]].push_back(s[i]);
		for(int i=1;i<=n;++i) {
			if (quest[i].size()==0) continue;
			int a=s[i],b=e[i];
			int total=limit_size+1;
			vector<int>jmp(limit_size+2,-1);
			vector<int>dp(limit_size+2,INF);
			for(int j=limit_size;j>=a;--j){
				for(auto&x:toado[j]) {
					if (x>=a) total=min(total,x);
					if (j==b) total=a-1;
				}
				if (total<=j) jmp[j]=total;
			}
			dp[a-1]=0;
			for(int j=a;j<=limit_size;++j){
				if (jmp[j]>=0 && dp[jmp[j]]!=INF){
					dp[j]=1+dp[jmp[j]];
				}
			}
			for(auto&x:quest[i]) ans[x.second]=dp[s[x.first]];
		}
		
		for(int i=1;i<=q;++i) {
			if (ans[i]>=INF) cout<<"impossible\n";
				else cout<<ans[i]<<'\n';
		}
		return;
	}
}

namespace subtask3{
	bool check(){
		return true;
	}
	
	const int MAXLOG=(int)17;
		int par[N+2][MAXLOG+2];
		int id[N+2];
	
		int binary_jump(int x,int target){
			if (id[x]>id[target]) return INF;
			if (id[target]==id[x]) return 0;
			x=id[x];
			int ans=0;
			for(int i=MAXLOG;i>=0;--i){
				if (par[x][i]<id[target]){
					ans+=(1<<i);
					x=par[x][i];
				}
			}
			for(int i=0;i<=MAXLOG;++i){
				if (par[x][i]>=id[target]){
					return ans+(1<<i);
				}
			}
			return INF;
		}
	
	void main_code(){
		
		
		for(int i=0,j=0;i<pp.size();++i){
			while (j<pp.size() && s[pp[j]]<=e[pp[i]] && e[pp[i]]<=e[pp[j]]) ++j;
			par[i][0]=j-1;
			id[pp[i]]=i;
		}
		for(int j=1;j<=MAXLOG;++j){
			for(int i=0;i<n;++i){
				par[i][j]=par[par[i][j-1]][j-1];
			}	
		}
		

		
		for(int i=1;i<=q;++i){
			int k=binary_jump(l[i],r[i]);
			if (k>=INF) cout<<"impossible\n";
				else cout<<k<<'\n';
		}
		return;
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	#define task "main"
	if (fopen(task".inp","r")){
		freopen(task".inp","r",stdin);
		freopen(task".out","w",stdout);
	}
	
	cin>>n>>q;
	for(int i=1;i<=n;++i) cin>>s[i]>>e[i];
	for(int i=1;i<=q;++i) cin>>l[i]>>r[i];
	
	for(int i=1;i<=n;++i) {
		nen.push_back(s[i]);
		nen.push_back(e[i]);
	}
	sort(nen.begin(),nen.end());
	nen.resize(unique(nen.begin(),nen.end())-nen.begin());
	limit_size=nen.size();
	for(int i=1;i<=n;++i){
		s[i]=Find(s[i]) , e[i]=Find(e[i]);
		pp.push_back(i);
	}
	sort(pp.begin(),pp.end(),[&](int x,int y){
		if (s[x]!=s[y]) return s[x]<s[y];
		return e[x]<e[y];
	});
	if (subtask2::check()) return subtask2::main_code(),0;
//	if (subtask1::check()) return subtask1::main_code(),0;
	if (subtask3::check()) return subtask3::main_code(),0;
	return 0;
}

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:127:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
events.cpp:128:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  128 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...