Submission #1109863

#TimeUsernameProblemLanguageResultExecution timeMemory
1109863Zero_OPPassport (JOI23_passport)C++14
100 / 100
543 ms89780 KiB
#include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("task.inp", "r", stdin); freopen("task.out", "w", stdout); #endif // LOCAL int N; cin >> N; vector<vector<pair<int, int>>> adj(N * 4); vector<int> ln(N * 4), rn(N * 4); int n = N; function<int(int, int)> build = [&](int l, int r){ if(l == r) return l; int mid = l + r >> 1; int o = n++, lc = build(l, mid), rc = build(mid + 1, r); ln[o] = lc; rn[o] = rc; adj[lc].emplace_back(o, 0); adj[rc].emplace_back(o, 0); return o; }; function<void(int, int, int, int, int, int)> addEdge = [&]( int cur, int l, int r, int u, int v, int s){ if(u <= l && r <= v){ adj[cur].emplace_back(s, 1); } else{ int mid = l + r >> 1; if(u <= mid) addEdge(ln[cur], l, mid, u, v, s); if(mid < v) addEdge(rn[cur], mid + 1, r, u, v, s); } }; int rt = build(0, N - 1); for(int i = 0; i < N; ++i){ int l, r; cin >> l >> r; --l, --r; addEdge(rt, 0, N - 1, l, r, i); } auto bfs_deque = [&](int s, vector<vector<pair<int, int>>>& adj) -> vector<int>{ vector<int> dist(4 * N, -1); dist[s] = 0; deque<int> dq; dq.push_back(s); while(!dq.empty()){ int u = dq.front(); dq.pop_front(); for(auto [v, w] : adj[u]){ if(dist[v] == -1){ dist[v] = dist[u] + w; if(w == 0) dq.push_front(v); else dq.push_back(v); } } } return dist; }; vector<int> distS = bfs_deque(0, adj), distT = bfs_deque(N - 1, adj); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; vector<int> answer(N * 4, -1); for(int i = 0; i < N; ++i){ if(distS[i] != -1 && distT[i] != -1){ answer[i] = max(1, distS[i]) + max(1, distT[i]) - 1; pq.push(make_pair(answer[i], i)); } } while(!pq.empty()){ int cur, u; tie(cur, u) = pq.top(); pq.pop(); for(auto [v, w] : adj[u]){ if(answer[v] == -1 || answer[v] > answer[u] + w){ answer[v] = answer[u] + w; pq.push(make_pair(answer[v], v)); } } } int Q; cin >> Q; while(Q--){ int u; cin >> u; --u; cout << answer[u] << '\n'; } return 0; }

Compilation message (stderr)

passport.cpp: In lambda function:
passport.cpp:22:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   22 |         int mid = l + r >> 1;
      |                   ~~^~~
passport.cpp: In lambda function:
passport.cpp:37:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |             int mid = l + r >> 1;
      |                       ~~^~~
passport.cpp: In lambda function:
passport.cpp:60:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   60 |             for(auto [v, w] : adj[u]){
      |                      ^
passport.cpp: In function 'int main()':
passport.cpp:87:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   87 |         for(auto [v, w] : adj[u]){
      |                  ^
#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...