Submission #114868

#TimeUsernameProblemLanguageResultExecution timeMemory
114868WhipppedCreamHighway Tolls (IOI18_highway)C++17
51 / 100
263 ms25628 KiB
#include <bits/stdc++.h> #include "highway.h" #pragma GCC optimize ("O3") #pragma GCC target ("sse4") using namespace std; #define X first #define Y second #define pb push_back typedef pair<int, int> ii; typedef long long ll; const int maxn = 9e4+5; vector<ii> adj[maxn]; int ped[maxn]; int dep[maxn]; vector<int> buck[maxn]; int n, m; void dfs(int u = 0, int p = -1, int d = 0) { dep[u] = d; buck[d].pb(u); for(auto kk : adj[u]) { int v = kk.X, id = kk.Y; if(v == p) continue; ped[v] = id; dfs(v, u, d+1); } } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { n = N; m = U.size(); for(int i = 0; i< m; i++) { adj[U[i]].pb(ii(V[i], i)); adj[V[i]].pb(ii(U[i], i)); } ll base = ask(vector<int>(m, 0)); dfs(); int down = 0; for(int i = 0; i< n; i++) down = max(down, dep[i]); int lo = 0, hi = down; while(lo< hi) { int mid = (lo+hi+1)/2; vector<int> send(m, 0); for(int i = mid; i<= down; i++) { for(int u : buck[i]) { send[ped[u]] = 1; } } ll exp = ask(send); // printf("try %d = %lld\n", mid, exp); if(exp == base) hi = mid-1; else lo = mid; } int reach = lo; // printf("reach = %d\n", reach); lo = 0, hi = ((int) buck[reach].size())-1; while(lo< hi) { int mid = (lo+hi)/2; vector<int> send(m, 0); for(int i = 0; i<= mid; i++) { send[ped[buck[reach][i]]] = 1; } ll exp = ask(send); if(exp == base) lo = mid+1; else hi = mid; } int S = buck[reach][lo]; for(int i = 0; i<= down; i++) buck[i].clear(); ped[S] = -1; dfs(S, -1, 0); int reach2 = base/A; lo = 0, hi = ((int) buck[reach2].size())-1; // for(int i = 0; i< n; i++) printf("ped[%d] = %d\n", i, ped[i]); while(lo< hi) { int mid = (lo+hi)/2; vector<int> send(m, 0); for(int i = 0; i<= mid; i++) { send[ped[buck[reach2][i]]] = 1; } ll exp = ask(send); if(exp == base) lo = mid+1; else hi = mid; } int T = buck[reach2][lo]; answer(S, T); }
#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...