제출 #1270205

#제출 시각아이디문제언어결과실행 시간메모리
1270205bhnmPassport (JOI23_passport)C++17
100 / 100
643 ms97332 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 200000 + 5; const int INF = 1e9; int n,m,x; int L[MAXN], R[MAXN], nodeId[MAXN]; int distFrom1[5*MAXN], distFromN[5*MAXN], dist[5*MAXN], order[5*MAXN]; int p[5*MAXN]; vector<pair<int,int>> graph[5*MAXN]; void buildSegmentTree(int cur, int l, int r) { if (l == r) { graph[nodeId[l]].push_back({cur, 0}); return; } int mid = (l + r) / 2; buildSegmentTree(cur*2, l, mid); buildSegmentTree(cur*2+1, mid+1, r); graph[cur*2].push_back({cur, 0}); graph[cur*2+1].push_back({cur, 0}); } void addEdge(int cur, int l, int r, int ql, int qr, int x) { if (ql <= l && r <= qr) { graph[cur].push_back({nodeId[x], 1}); return; } if (qr < l || ql > r) return; int mid = (l + r) / 2; addEdge(cur*2, l, mid, ql, qr, x); addEdge(cur*2+1, mid+1, r, ql, qr, x); } // 0-1 BFS void bfs(int start, int startVal, bool keepDist) { deque<int> dq; if (!keepDist) { for (int i = 1; i <= 5*n; i++) dist[i] = INF; } dist[start] = startVal; dq.push_back(start); while (!dq.empty()) { int u = dq.front(); dq.pop_front(); for (pair<int,int> it : graph[u]) { int v = it.first; int w = it.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (w == 0) dq.push_front(v); else dq.push_back(v); } } } } bool cmp(int a,int b) { return dist[a] < dist[b]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for (int i = 1; i <= n; i++) { cin >> L[i] >> R[i]; nodeId[i] = 4*n + i; } buildSegmentTree(1, 1, n); for (int i = 1; i <= n; i++) { addEdge(1, 1, n, L[i], R[i], i); } bfs(nodeId[1], 0, false); for (int i = 1; i <= 5*n; i++) distFrom1[i] = dist[i]; bfs(nodeId[n], 0, false); for (int i = 1; i <= 5*n; i++) distFromN[i] = dist[i]; for(int i = 1;i<=4*n;++i) { dist[i] = INF; } for(int i = 4*n+1;i<=5*n;++i) { dist[i] = distFrom1[i] + distFromN[i]; if(i > 4 * n + 1 && i < 5*n) { dist[i]--; } p[i] = i; } sort(p+1,p+5*n+1,cmp); for(int i = 1;i<=5*n;++i) { bfs(p[i],dist[p[i]],true); } cin>>m; while(m--) { cin>>x; if(dist[nodeId[x]] >= INF) { cout<<-1<<"\n"; } else { cout<<dist[nodeId[x]]<<"\n"; } } }
#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...