제출 #1337979

#제출 시각아이디문제언어결과실행 시간메모리
1337979NAMINPassport (JOI23_passport)C++20
0 / 100
1 ms348 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=2;i<len;i++){
		adj[i*2+1].push_back(make_pair(i,0));
		adj[i*2].push_back(make_pair(i,0));
	}
	for(int i=0;i<N;i++){
		int l=L[i]+len,r=R[i]+len;
		if(l==r)
			continue;
		while(l<=r){
			if(l%2==1)
				adj[l++].push_back(make_pair(len+i,1));
			if(r%2==0)
				adj[r--].push_back(make_pair(len+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
		for(auto [d,node] : dep){
			pq.push(make_pair(d,len+node));
		}
		vector<int> dist(3*len+1,1e9);
		vector<int> vis(3*len+1,0);
		//vector<int> used(2*len+3,0);
		
		while(!pq.empty()){
			auto [d,node] = pq.top();
			dist[node]=min(dist[node],d);
			pq.pop();
			if(vis[node]){
				continue;
			}
			vis[node]=true;
			for(auto [u,w] : adj[node]){
				pq.push({d+w,u});
			}
			/*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);
	d1[len]=1;
	deps={{0,N-1}};
	vector<int> dn=calc(deps);
	dn[len+N-1]=1;
	deps.clear();
	for(int i=0;i<N;i++){
		if(d1[len+i]+dn[len+i]<1e9)
			deps.push_back(make_pair(d1[len+i]+dn[len+i],i));
	}
	vector<int> dist=calc(deps);

	for(int i=0;i<Q;i++){
		if(dist[len+X[i]]<1e9)
			cout << dist[len+X[i]]-1 << 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...