Submission #1337972

#TimeUsernameProblemLanguageResultExecution timeMemory
1337972NAMINPassport (JOI23_passport)C++20
100 / 100
387 ms64212 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<2*len;i++){
		//adj[i].push_back(make_pair(i/2,0));
		//adj[i*2+1].push_back(make_pair(i,0));
	//}
	for(int i=0;i<N;i++){
		int l=L[i]+len,r=R[i]+len+1;
		while(l<r){
			if(l&1)
				adj[l++].push_back(make_pair(i,1));
			if(r&1)
				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);
	d1[0]=1;
	deps={{0,N-1}};
	vector<int> dn=calc(deps);
	dn[N-1]=1;
	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));
	}
	vector<int> dist=calc(deps);

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