Submission #284050

#TimeUsernameProblemLanguageResultExecution timeMemory
284050milleniumEeeeHighway Tolls (IOI18_highway)C++14
5 / 100
158 ms8732 KiB
#include "highway.h" #include <bits/stdc++.h> #define pii pair<int, int> #define szof(s) (int)s.size() #define ll long long #define fr first #define sc second using namespace std; const int N = 90004; vector <int> g[N]; int x[N], y[N]; int n, m, a, b; int S, T; vector <int> w; map <pii, bool> mp; struct SmallSolve { int dfs(int v, int par) { for (int to : g[v]) { if (to == par) { continue; } if (mp.count({v, to})) { return dfs(to, v); } } return v; } void solve(int NN, vector<int> U, vector<int> V, int A, int B) { n = NN; m = U.size(); a = A; b = B; w.resize(m, 1); for (int i = 0; i < m; i++) { x[i] = U[i]; y[i] = V[i]; g[x[i]].push_back(y[i]); g[y[i]].push_back(x[i]); } ll before = ask(w); for (int i = 0; i < m; i++) { w[i] = 0; int nxt = ask(w); if (nxt < before) { w[i] = 0; before = nxt; } else { w[i] = 1; } } for (int i = 0; i < m; i++) { if (w[i] == 0) { mp[{x[i], y[i]}] = 1; mp[{y[i], x[i]}] = 1; } } S = 0; T = dfs(0, -1); answer(S, T); } }subtask1; struct LineSolve { vector <int> w; bool need(int NN, vector<int> U, vector<int> V, int A, int B) { bool ok = 1; ok &= (NN - 1 == szof(U)); for (int i = 0; i < szof(U); i++) { ok &= (U[i] == i && V[i] == i + 1); } return ok; } void init(int l, int r) { for (int i = 0; i < m; i++) { if (l <= i && i <= r) { w[i] = 0; } else { w[i] = 1; } } } void solve(int NN, vector<int> U, vector<int> V, int A, int B) { n = NN; m = U.size(); a = A; b = B; w.resize(m, 1); int before = ask(w); for (int i = 0; i < m; i++) { x[i] = U[i]; y[i] = V[i]; g[x[i]].push_back(y[i]); g[y[i]].push_back(x[i]); } int l = -1, r = m - 1; while (r - l > 1) { int mid = (l + r) >> 1; init(0, mid); if (ask(w) < before) { r = mid; } else { l = mid; } } S = (l == -1 ? x[0] : y[l]); l = 0, r = m; while (r - l > 1) { int mid = (l + r) >> 1; init(mid, m - 1); if (ask(w) < before) { l = mid; } else { r = mid; } } T = (r == m ? y[m - 1] : x[r]); answer(S, T); } }subtask3; void find_pair(int NN, vector<int> U, vector<int> V, int A, int B) { if (NN <= 100 && szof(U) == NN - 1) { subtask1.solve(NN, U, V, A, B); } if (subtask3.need(NN, U, V, A, B)) { subtask3.solve(NN, U, V, A, B); } } /* 10 9 4 9 4 1 4 6 9 5 5 0 8 2 1 7 7 4 4 2 2 9 3 9 */
#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...