Submission #123901

#TimeUsernameProblemLanguageResultExecution timeMemory
123901nvmdavaHighway Tolls (IOI18_highway)C++17
100 / 100
411 ms10588 KiB
#include "highway.h" #define pb push_back #include <bits/stdc++.h> using namespace std; vector<int> adj[100005]; vector<int> path; long long def; vector<int> w; int v[3], p[100005], cat[100005]; vector<int> com[3]; int solve(vector<int>& ve){ reverse(ve.begin(), ve.end()); int l = 0, r = ve.size() - 1; while(l != r){ int m = (l + r) >> 1; for(int i = 0; i <= m; i++) w[p[ve[i]]] = 1; if(ask(w) > def) r = m; else l = m + 1; for(int i = 0; i <= m; i++) w[p[ve[i]]] = 0; } return ve[l]; } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { int m = U.size(); for(int i = 0; i < m; i++){ adj[U[i]].pb(i); adj[V[i]].pb(i); path.push_back(V[i] + U[i]); } w = vector<int>(m, 0); def = ask(w); int l = 0, r = m - 1; while(l != r){ int mm = (l + r) >> 1; for(int i = 0; i <= mm; i++) w[i] = 1; if(ask(w) > def) r = mm; else l = mm + 1; for(int i = 0; i <= mm; i++) w[i] = 0; } queue<pair<int, int> > q; q.push({V[l], 1}); q.push({U[l], 2}); cat[V[l]] = 1; p[V[l]] = l; p[U[l]] = l; cat[U[l]] = 2; com[1].pb(V[l]); com[2].pb(U[l]); while(!q.empty()){ int u = q.front().first, t = q.front().second; q.pop(); for(int x : adj[u]){ int e = path[x] - u; if(cat[e]) continue; cat[e] = t; com[t].pb(e); p[e] = x; q.push({e, t}); } } for(int i = 0; i < m; i++) w[i] = 1; for(int i = 0; i < N; i++) w[p[i]] = 0; answer(solve(com[1]), solve(com[2])); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...