제출 #1337985

#제출 시각아이디문제언어결과실행 시간메모리
1337985NAMINPassport (JOI23_passport)C++20
100 / 100
317 ms64220 KiB
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;

struct Node{
	int l,r,d;
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int N;
	cin >> N;
	vector<int> L(N),R(N);
	for(int i=0;i<N;i++){
		cin >> L[i] >> R[i];
		L[i]--,R[i]--;
	}
	int Q;
	cin >> Q;
	vector<int> X(Q);
	for(int i=0;i<Q;i++){
		cin >> X[i];
		X[i]--;
	}
	
	int len=1;
	while(len<N)
		len*=2;
	vector<pair<int,int>> adj[len*2+3];
	for(int i=0;i<N;i++){
		int l=L[i]+len,r=R[i]+len;
		while(l<=r){
			if(l%2==1)
				adj[l++].push_back(make_pair(i,1));
			if(r%2==0)
				adj[r--].push_back(make_pair(i,1));
			l/=2,r/=2;
		}
	}

	auto calc = [&](vector<pair<int,int>> dep){
		priority_queue<pair<int,int>
					,vector<pair<int,int>>,greater<>> pq;//dist,node
		vector<int> dist(N+1,1e9);
		for(auto [d,node] : dep){
			pq.push(make_pair(d,node));
			dist[node]=d;
		}
		vector<int> vis(2*len,0);
		vector<int> used(2*len+3,0);
		
		while(!pq.empty()){
			auto [d,node] = pq.top();
			pq.pop();
			if(vis[node]){
				continue;
			}
			vis[node]=true;
			int u = node+len;
			while(u>=1 && !used[u]){
				used[u]=true;
				for(auto [v,w] : adj[u]){
					if(d+w<dist[v]){
						dist[v]=d+w;
						pq.push({d+w,v});
					}
				}
				u/=2;
			}
		}

		return dist;
	};
	

	vector<pair<int,int>> deps{{0,0}};
	vector<int> d1=calc(deps);
	deps={{0,N-1}};
	vector<int> dn=calc(deps);
	deps.clear();
	for(int i=0;i<N;i++){
		if(d1[i]+dn[i]<1e9)
			deps.push_back(make_pair(d1[i]+dn[i]-(i!=0&&i!=N-1),i));
	}
	vector<int> dist=calc(deps);

	for(int i=0;i<Q;i++){
		if(dist[X[i]]<1e9)
			cout << dist[X[i]] << endl;
		else
			cout << -1 << endl;
	}
}


#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...