Submission #286324

#TimeUsernameProblemLanguageResultExecution timeMemory
286324kartelHighway Tolls (IOI18_highway)C++14
51 / 100
297 ms262148 KiB
#include <bits/stdc++.h> //#include "grader.cpp" #include "highway.h" //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #define in(x) freopen(x, "r", stdin) #define out(x) freopen(x, "w", stdout) //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("-O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("fast-math") //#pragma GCC optimize("no-stack-protector") #define F first #define S second #define pb push_back #define N +100500 #define M ll(1e9 + 7) #define sz(x) (int)x.size() #define re return #define oo ll(1e9) #define el '\n' #define Max_A int(1e9) //#define el endl #define pii pair <int, int> #define piii pair <int, pair <int, int> > #define psi pair <string, int> #define err ld(1e-9) #define Max_S int(3e6) #define last(x) (x).back() #define all(x) (x).begin(), (x).end() #define allr(x) (x).rbegin(), (x).rend() #define arr_all(x, n) (x + 1), (x + 1 + n) #define vi vector<int> using namespace std; //using namespace __gnu_pbds; //typedef tree <int, null_type, less_equal <int> , rb_tree_tag, tree_order_statistics_node_update> ordered_set; typedef long long ll; typedef long double ld; vector <pii> g[N]; ll base; int ans[2], d[N], D[N]; vi w, lt; bool gd(int n, int m, int x, ll base) { for (int i = 0; i <= x; i++) w[i] = 0; for (int i = x + 1; i < m; i++) w[i] = 1; return (ask(w) == base); } int getft(int n, int m) { for (int i = 0; i < m; i++) w[i] = 1; base = ask(w); int l = 0; int r = m - 1; while (l < r) { int md = (l + r) >> 1; if (gd(n, m, md, base)) l = md + 1; else r = md; } return l; } int getlst(vi lt, int m) { for (int i = 0; i < m; i++) w[i] = 0; base = ask(w); int l = -1; int r = sz(lt) - 1; while (l < r) { int md = (l + r + 1) >> 1; for (int i = 0; i < md; i++) w[lt[i]] = 0; for (int i = md; i < sz(lt); i++) w[lt[i]] = 1; if (ask(w) != base) l = md; else r = md - 1; } return l; } void dfs(int v, int pr) { if (pr == -1) d[v] = 0; else d[v] = d[pr] + 1; for (auto u : g[v]) { if (u.F == pr) continue; dfs(u.F, v); } } void dfs_0(int v, int pr, int de) { D[v] = de; for (auto u : g[v]) { if (u.F == pr) continue; lt.pb(u.S); dfs_0(u.F, v, de + 1); } } void find_pair(int n, vi u, vi v, int a, int b) { int m = sz(u); for (int i = 0; i < m; i++) { g[u[i]].pb({v[i], i}); g[v[i]].pb({u[i], i}); } dfs(0, -1); w.resize(m); int ft = getft(n, m); int upper, lower; if (d[u[ft]] < d[v[ft]]) upper = u[ft], lower = v[ft]; else upper = v[ft], lower = u[ft]; lt.pb(ft); D[lower] = -1; dfs_0(upper, lower, 0); // for (auto x : lt) cout << x << " "; // cout << el; int lst = getlst(lt, m); // cerr << lst << el; if (lst == -1) { int U = u[lt[0]]; int V = v[lt[0]]; if (D[U] > D[V]) ans[0] = U; else ans[0] = V; } else { int U = u[lt[lst]]; int V = v[lt[lst]]; if (D[U] > D[V]) ans[0] = U; else ans[0] = V; } lt.clear(); lt.pb(ft); D[upper] = -1; dfs_0(lower, upper, 0); lst = getlst(lt, m); // cerr << lst << el; if (lst >= sz(lt)) { int U = u[lt[0]]; int V = v[lt[0]]; if (D[U] > D[V]) ans[1] = U; else ans[1] = V; } else { int U = u[lt[lst]]; int V = v[lt[lst]]; if (D[U] > D[V]) ans[1] = U; else ans[1] = V; } // cout << ans[0] << " " << ans[1] << el; answer(ans[0], ans[1]); } /*int main() { srand(time(0)); cout.precision(3); cout << fixed; ios_base::sync_with_stdio(0); iostream::sync_with_stdio(0); ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); // in("input.txt"); // out("output.txt"); }*/ /* 4 4 0110 0000 1101 1100 */
#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...