답안 #601106

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
601106 2022-07-21T11:19:40 Z CSQ31 Event Hopping (BOI22_events) C++17
10 / 100
1500 ms 8496 KB
#include <bits/stdc++.h>
using namespace std;
#define all(a) a.begin(),a.end()
#define owo ios_base::sync_with_stdio(0);cin.tie(0);
const int MAXN = 1e5+1;
int s[MAXN],e[MAXN];
//fuck binlift how
//p(k,i) = min s if we jump backwards 2^k times
//p(k-1,i) = min of p(k-1),i<= x <= i ,p(k-1,x)
//yeesh but this n log^2n
//should pass maybe?
//1e5 * 18 * 18 = 3e7
int p[19][MAXN];
typedef pair<int,int> pii;
#define fi first
#define se second
vector<pii>T(8*MAXN,{1e9,1});
void upd(int v,int l,int r,int pos,pii val){
	if(l==r){
		T[v] = min(T[v],val);
		return;
	}
	int tm = (l+r)/2;
	if(pos<=tm)upd(2*v,l,tm,pos,val);
	else upd(2*v+1,tm+1,r,pos,val);
	T[v] = min(T[2*v],T[2*v+1]);
}
pii query(int v,int l,int r,int tl,int tr){
	if(l>r)return {1e9,1};
	if(l==tl && r==tr)return T[v];
	int tm = (tl+tr)/2;
	return min(query(2*v,l,min(r,tm),tl,tm),
	           query(2*v+1,max(l,tm+1),r,tm+1,tr));
}
int main()
{
	owo
	int n,q;
	cin>>n>>q;
	vector<int>crd;
	for(int i=0;i<n;i++)cin>>s[i]>>e[i];
	for(int i=0;i<n;i++){
		crd.push_back(s[i]);
		crd.push_back(e[i]);
	}
	sort(all(crd));
	crd.resize(unique(all(crd)) - crd.begin());
	for(int i=0;i<n;i++){
		s[i] = lower_bound(all(crd),s[i]) - crd.begin()+1;
		e[i] = lower_bound(all(crd),e[i]) - crd.begin()+1;
	}
	int m = crd.size();
	for(int i=0;i<n;i++)upd(1,1,m,e[i],{s[i],i});
	for(int i=0;i<n;i++){
		p[0][i] = i;
		for(int j=0;j<n;j++){
			/*if(s[i] <= e[j] && e[j] <= e[i]){
				if(s[j] < s[p[0][i]])p[0][i] = j;
			}*/
			pii res = query(1,s[i],e[i],1,m);
			if(res.fi != 1e9)p[0][i] = res.se;	
		}
	}
	//for(int i=0;i<n;i++)cout<<p[0][i]<<" ";
	//cout<<'\n';
	for(int i=1;i<=18;i++){
		for(int j=0;j<n;j++){
			p[i][j] = p[i-1][p[i-1][j]];	
		}
	}
	while(q--){
		int l,r;
		cin>>l>>r;
		l--;
		r--;
		if(l==r){
			cout<<0<<'\n';
			continue;
		}
		if(e[l] > e[r]){
			cout<<"impossible"<<'\n';
			continue;
		}
		if(s[r] <= e[l]){
			cout<<1<<'\n';
			continue;
		}
		int ans = 1; //one for actually arrivinf at l
		/*
		while(s[r] > e[l]){
			if(p[0][r] == r){
				ans = -1;
				break;
			}
			ans++;
			r = p[0][r];
		}*/
		for(int i=18;i>=0;i--){
			int v = p[i][r];
			if(s[v] > e[l]){
				r = v;
				ans+=(1<<i);
			}
		}
		ans++;
		if(r == p[0][r])ans=-1;	
		if(ans==-1)cout<<"impossible"<<'\n';
		else cout<<ans<<'\n';
	}
	
	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Execution timed out 1586 ms 8448 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 63 ms 6744 KB Output is correct
4 Correct 62 ms 6748 KB Output is correct
5 Correct 63 ms 6756 KB Output is correct
6 Correct 75 ms 6752 KB Output is correct
7 Correct 118 ms 6876 KB Output is correct
8 Correct 122 ms 6748 KB Output is correct
9 Correct 7 ms 6740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 63 ms 6744 KB Output is correct
4 Correct 62 ms 6748 KB Output is correct
5 Correct 63 ms 6756 KB Output is correct
6 Correct 75 ms 6752 KB Output is correct
7 Correct 118 ms 6876 KB Output is correct
8 Correct 122 ms 6748 KB Output is correct
9 Correct 7 ms 6740 KB Output is correct
10 Correct 3 ms 6612 KB Output is correct
11 Correct 3 ms 6612 KB Output is correct
12 Correct 64 ms 6752 KB Output is correct
13 Correct 65 ms 6756 KB Output is correct
14 Correct 64 ms 6860 KB Output is correct
15 Correct 79 ms 6744 KB Output is correct
16 Correct 115 ms 6760 KB Output is correct
17 Correct 124 ms 6744 KB Output is correct
18 Correct 9 ms 6748 KB Output is correct
19 Execution timed out 1574 ms 6752 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Correct 3 ms 6612 KB Output is correct
3 Correct 63 ms 6744 KB Output is correct
4 Correct 62 ms 6748 KB Output is correct
5 Correct 63 ms 6756 KB Output is correct
6 Correct 75 ms 6752 KB Output is correct
7 Correct 118 ms 6876 KB Output is correct
8 Correct 122 ms 6748 KB Output is correct
9 Correct 7 ms 6740 KB Output is correct
10 Correct 4 ms 6612 KB Output is correct
11 Correct 3 ms 6612 KB Output is correct
12 Correct 64 ms 6732 KB Output is correct
13 Correct 64 ms 6740 KB Output is correct
14 Correct 63 ms 6752 KB Output is correct
15 Correct 82 ms 6732 KB Output is correct
16 Correct 129 ms 6748 KB Output is correct
17 Correct 130 ms 6752 KB Output is correct
18 Correct 7 ms 6740 KB Output is correct
19 Execution timed out 1586 ms 8496 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1568 ms 8496 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 6612 KB Output is correct
2 Execution timed out 1586 ms 8448 KB Time limit exceeded
3 Halted 0 ms 0 KB -