제출 #1362526

#제출 시각아이디문제언어결과실행 시간메모리
1362526Jawad_Akbar_JJPassport (JOI23_passport)C++20
100 / 100
569 ms90704 KiB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;
const int N = 1<<18;
vector<pair<int, int>> nei[N<<1];
int dst[3][N<<1];

void dijkstra(int D[]){
	priority_queue<pair<int, int>> pq;
	for (int i=1;i<N+N;i++)
		pq.push({-D[i], i});

	while (pq.size() > 0){
		auto [mn, u] = pq.top();
		pq.pop();

		mn = -mn;
		if (D[u] != mn)
			continue;

		for (auto [i, w] : nei[u]){
			if (D[u] + w < D[i]){
				D[i] = D[u] + w;
				pq.push({-D[i], i});
			}
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, q;
	cin>>n;

	for (int i=N+N-1; i; i--){
		dst[0][i] = dst[1][i] = N;

		nei[i].push_back({i / 2, 0});
	}

	for (int i=1;i<=n;i++){
		int l, r;
		cin>>l>>r;
		dst[2][i+N] -= (1 < i and i < n);

		for (l += N-1, r += N+1; l + 1 < r; l /= 2, r /= 2){
			if (!(l & 1))
				nei[l^1].push_back({i + N, 1});
			if (r & 1)
				nei[r^1].push_back({i + N, 1});
		}
	}



	dst[0][N+1] = dst[1][N+n] = 0;
	dijkstra(dst[0]);
	dijkstra(dst[1]);

	for (int i=1;i<N+N;i++)
		dst[2][i] += dst[0][i] + dst[1][i];
	dijkstra(dst[2]);


	cin>>q;
	for (int i=1, x;i<=q;i++){
		cin>>x;
		cout<<(dst[2][x + N] >= N ? -1 : dst[2][x + N])<<endl;
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…