Submission #1183996

#TimeUsernameProblemLanguageResultExecution timeMemory
1183996KK_1729Passport (JOI23_passport)C++20
100 / 100
790 ms86812 KiB
#include <bits/stdc++.h>
using namespace std;

// #define int long long
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define pb push_back
#define all(a) a.begin(), a.end()
#define endl "\n"

void printVector(vector<int> a){
	for (auto x: a) cout << x << " ";
	cout << endl;
}

struct Graph{
	vector<vector<pair<int, int>>> adj;
	vector<int> visited;
	// vector<int> dist;

	int N;
	Graph(int n){
		adj.resize(n+1);
		visited.resize(n+1);
		// dist.resize(n+1, 1e17);
		this->N = n;
	}

	void a(int u, int v, int w){
		adj[u].pb({v, w});
	}

	vector<int> dijkstra(int start){
		using T = pair<long long, int>;
		priority_queue<T, vector<T>, greater<T>> pq;
		vector<int> dist(N+1, 1e7);
		dist[start] = 0; 

		pq.push({0, start});
		while (!pq.empty()) {

			const auto [cdist, node] = pq.top();
			pq.pop();
			if (cdist != dist[node]) { continue; }
			for (const pair<int, int> &i : adj[node]) {
				if (cdist + i.second < dist[i.first]) {
					pq.push({dist[i.first] = cdist + i.second, i.first});
				}
			}
		}
		return dist;
	}
};
void solve(){
	int n; cin >> n;
	vector<pair<int, int>> intervals;
	vector<int> candid;
	FOR(i,0,n){
		int l, r; cin >> l >> r;

		intervals.pb({l, r});
		if (l == 1 && r == n) candid.pb(i+1);
	}

	int N = n;
	while (__builtin_popcount(N) != 1) N++;
	Graph g(2*N+1);

	FOR(i,1,N){

		g.a(2*i, i, 0);
		g.a(2*i+1, i, 0);
	}

	FOR(i,1,n+1){
		int l = intervals[i-1].first;
		int r = intervals[i-1].second;
		stack<vector<int>> s;
		s.push({1, N, l, r, 1});
		while (!s.empty()){
			vector<int> x = s.top();
			s.pop();
			if (x[0] > x[3] || x[1] < x[2]) continue;

			if (x[0] >= x[2] && x[1] <= x[3]){
				g.a(x[4], i+N-1, 1);
				continue;
			}
			int mid = (x[0]+x[1])/2;
			s.push({x[0], mid, l, r, 2*x[4]});
			s.push({mid+1, x[1], l, r, 2*x[4]+1});
		}
	}
	// FOR(i,0,2*N){
	// 	for (auto x: g.adj[i]){
	// 		cout << i << " " << x.first << " " << x.second << endl;
	// 	}
	// }
	vector<int> dist1 = g.dijkstra(N);
	vector<int> distn = g.dijkstra(N+n-1);
	dist1[N] = 1;
	distn[N+n-1] = 1;

	FOR(i,1,N+1){
		g.a(2*N, i+N-1, dist1[i+N-1]+distn[i+N-1]);

	}

	vector<int> distans = g.dijkstra(2*N);
	int q; cin >> q;
	while (q--){
		int x; cin >> x;

		if (distans[x+N-1] > 1e6){
			cout << -1 << endl;
		}else{
			cout << distans[x+N-1]-1 << endl;
		}
	}
}


int32_t main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);
	int t = 1; // cin >> t;
	while (t--) solve();
}
#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...