답안 #577682

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
577682 2022-06-15T08:04:35 Z vanic Event Hopping (BOI22_events) C++14
10 / 100
1500 ms 74292 KB
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <queue>

using namespace std;

const int maxn=1e5+5, Log=18, pot=(1<<Log);

vector < int > svi;

void query(int L, int D, int x, int l, int d){
	if(L>=l && D<=d){
		svi.push_back(x);
		return;
	}
	if((L+D)/2>=l){
		query(L, (L+D)/2, x*2, l, d);
	}
	if((L+D)/2+1<=d){
		query((L+D)/2+1, D, x*2+1, l, d);
	}
}


pair < int, int > a[maxn];
set < int > s;
map < int, int > m;
int dist[pot*2];
int d[maxn];
vector < pair < int, int > >  ms[pot*2];

void precompute(){
	for(int i=2; i<pot*2; i++){
		ms[i].push_back({i/2, 0});
	}
}

void bfs(int x){
	memset(dist, -1, sizeof(dist));
	memset(d, -1, sizeof(d));
	queue < int > q1, q2;
	q1.push(a[x].second+pot);
	dist[a[x].second+pot]=0;
	d[x]=0;
	int tren=0;
	while(!q1.empty()){
		while(!q1.empty()){
			x=q1.front();
			q1.pop();
			for(int i=0; i<(int)ms[x].size(); i++){
				if(ms[x][i].second){
					if(dist[ms[x][i].first]==-1){
						dist[ms[x][i].first]=tren+1;
						q2.push(ms[x][i].first);
					}
					if(d[ms[x][i].second]==-1){
						d[ms[x][i].second]=tren+1;
					}
				}
				else{
					if(dist[ms[x][i].first]==-1){
						dist[ms[x][i].first]=tren;
						q1.push(ms[x][i].first);
					}
				}
			}
		}
		swap(q1, q2);
		tren++;
	}
}

int main(){
	precompute();
	int n, q;
	scanf("%d%d", &n, &q);
	for(int i=1; i<=n; i++){
		scanf("%d%d", &a[i].first, &a[i].second);
		s.insert(a[i].first);
		s.insert(a[i].second);
	}
	int br=0;
	for(auto it=s.begin(); it!=s.end(); it++){
		m[*it]=br;
		br++;
	}
	for(int i=1; i<=n; i++){
		a[i]={m[a[i].first], m[a[i].second]};
//		cout << a[i].first << ' ' << a[i].second << endl;
		query(0, pot-1, 1, a[i].first, a[i].second);
		while(!svi.empty()){
//			cout << "moji " << svi.back() << endl;
			ms[svi.back()].push_back({a[i].second+pot, i});
			svi.pop_back();
		}
	}
	int x, y;
	for(int i=0; i<q; i++){
		scanf("%d%d", &x, &y);
		bfs(x);
		if(d[y]==-1){
			printf("impossible\n");
		}
		else{
			printf("%d\n", d[y]);
		}
	}
	return 0;
}

Compilation message

events.cpp: In function 'int main()':
events.cpp:81:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |  scanf("%d%d", &n, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~
events.cpp:83:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |   scanf("%d%d", &a[i].first, &a[i].second);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
events.cpp:104:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |   scanf("%d%d", &x, &y);
      |   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31444 KB Output is correct
2 Execution timed out 1575 ms 41708 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 31432 KB Output is correct
2 Correct 44 ms 31444 KB Output is correct
3 Correct 55 ms 31604 KB Output is correct
4 Correct 42 ms 31548 KB Output is correct
5 Correct 44 ms 31508 KB Output is correct
6 Correct 39 ms 31504 KB Output is correct
7 Correct 49 ms 31784 KB Output is correct
8 Correct 42 ms 31788 KB Output is correct
9 Correct 41 ms 31420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 31432 KB Output is correct
2 Correct 44 ms 31444 KB Output is correct
3 Correct 55 ms 31604 KB Output is correct
4 Correct 42 ms 31548 KB Output is correct
5 Correct 44 ms 31508 KB Output is correct
6 Correct 39 ms 31504 KB Output is correct
7 Correct 49 ms 31784 KB Output is correct
8 Correct 42 ms 31788 KB Output is correct
9 Correct 41 ms 31420 KB Output is correct
10 Correct 34 ms 31444 KB Output is correct
11 Correct 33 ms 31328 KB Output is correct
12 Correct 47 ms 31568 KB Output is correct
13 Correct 41 ms 31488 KB Output is correct
14 Correct 42 ms 31572 KB Output is correct
15 Correct 41 ms 31588 KB Output is correct
16 Correct 43 ms 31700 KB Output is correct
17 Correct 48 ms 31772 KB Output is correct
18 Correct 53 ms 31432 KB Output is correct
19 Execution timed out 1588 ms 32712 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 31432 KB Output is correct
2 Correct 44 ms 31444 KB Output is correct
3 Correct 55 ms 31604 KB Output is correct
4 Correct 42 ms 31548 KB Output is correct
5 Correct 44 ms 31508 KB Output is correct
6 Correct 39 ms 31504 KB Output is correct
7 Correct 49 ms 31784 KB Output is correct
8 Correct 42 ms 31788 KB Output is correct
9 Correct 41 ms 31420 KB Output is correct
10 Correct 33 ms 31376 KB Output is correct
11 Correct 33 ms 31436 KB Output is correct
12 Correct 44 ms 31440 KB Output is correct
13 Correct 40 ms 31440 KB Output is correct
14 Correct 42 ms 31548 KB Output is correct
15 Correct 46 ms 31584 KB Output is correct
16 Correct 46 ms 31744 KB Output is correct
17 Correct 47 ms 31692 KB Output is correct
18 Correct 39 ms 31436 KB Output is correct
19 Correct 1291 ms 41616 KB Output is correct
20 Correct 787 ms 41652 KB Output is correct
21 Correct 908 ms 46896 KB Output is correct
22 Correct 500 ms 45488 KB Output is correct
23 Execution timed out 1580 ms 74292 KB Time limit exceeded
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1595 ms 41676 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31444 KB Output is correct
2 Execution timed out 1575 ms 41708 KB Time limit exceeded
3 Halted 0 ms 0 KB -