Submission #1274733

#TimeUsernameProblemLanguageResultExecution timeMemory
1274733nicolo_010통행료 (IOI18_highway)C++20
90 / 100
109 ms10912 KiB
#include <bits/stdc++.h> #include "highway.h" using namespace std; using ll = long long; using pii = pair<int, int>; vector<vector<pii>> adj; vector<int> endp; vector<int> edge; int t; vector<int> query; ll w; int first(int M) { int l = 0, r = M-1; int ans = 0; while (l <= r) { int m = (l+r)/2; for (int i=0; i<M; i++) { query[i] = (i <= m); } ll w2 = ask(query); if (w2 != w) { r=m-1; } else { l = m+1; ans = m+1; } } return ans; } int last(int M) { int l=0, r = t-1; int ans=-1; while (l <= r) { int m = (l+r+1)/2; for (int i=0; i<M; i++) { query[i] = (edge[i] >= m); } ll w2 = ask(query); if (w2 != w) { l = m+1; ans = m; } else { r = m-1; } } return ans; } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { int m = U.size(); query.assign(m, 0); w = ask(query); adj.resize(N); for (int i=0; i<m; i++) { int a = U[i]; int b = V[i]; adj[a].push_back({i, b}); adj[b].push_back({i, a}); } edge.resize(m); endp.resize(m); vector<int> ans(2); int e = first(m); int v = U[e]; for (int i=0; i<2; i++) { t = 0; queue<int> q; vector<int> dis(N, -1); dis[v] = 0; q.push(v); while (!q.empty()) { int u = q.front(); q.pop(); for (auto x : adj[u]) { if (dis[x.second] == -1) { dis[x.second] = dis[u]+1; endp[t] = x.second; edge[x.first] = t++; q.push(x.second); } else if (dis[x.second] == dis[u]+1) { edge[x.first] = N; } } } int le = last(m); v = ans[i] = endp[le]; } answer(ans[0], ans[1]); }
#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...