제출 #1274372

#제출 시각아이디문제언어결과실행 시간메모리
1274372nicolo_010통행료 (IOI18_highway)C++20
51 / 100
70 ms12036 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; void dfs(int n, int p) { for (auto x : adj[n]) { if (x.second == p) continue; endp[t] = x.second; edge[x.first] = t++; dfs(x.second, n); } } 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); t=0; dfs(0, -1); int e = first(m); int v = U[e]; int u = V[e]; vector<int> ans(2); //cout << e << endl; for (int i=0; i<2; i++) { t = 0; edge.assign(m, -1); dfs(v, u); int le = last(m); //cout << le << endl; ans[i] = (le==-1 ? v : endp[le]); //cout << ans[i] << endl; swap(v, u); } 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...