Submission #720450

#TimeUsernameProblemLanguageResultExecution timeMemory
720450LittleCube통행료 (IOI18_highway)C++14
0 / 100
173 ms39872 KiB
#include "highway.h" #include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define F first #define S second using namespace std; namespace { int M; ll D, dis[90000]; vector<pii> E[90000]; vector<int> tree; int vis[90000], sz[90000], pre[90000]; }; void dfs(int u) { vis[u] = sz[u] = 1; for (auto [v, i] : E[u]) if (!vis[v]) { dis[v] = dis[u] + 1; dfs(v); sz[u] += sz[v]; } tree.emplace_back(u); } int search(vector<int> v) { if (v.size() == 1) return v[0]; int mid = v.size() / 2; vector<int> l(v.begin(), v.begin() + mid), r(v.begin() + mid, v.end()), state(M, 0); for (auto i : l) for (auto [_, j] : E[i]) state[j] = 1; if (ask(state) != D) return search(l); else return search(r); } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { ::M = U.size(); assert(M == N - 1); D = ask(vector<int>(M, 0)); for (int i = 0; i < M; i++) E[U[i]].emplace_back(pii(V[i], i)), E[V[i]].emplace_back(pii(U[i], i)); vector<int> cent, subt; int t = 30, S = -1; while (t--) { vector<int> state(M, 0); for (int i = 0; i < N; i++) if (!vis[i]) { tree.clear(); dfs(i); int n = sz[i], c = -1; for (int j : tree) if (n - sz[j] <= n / 2) { bool valid = 1; for (auto [k, _] : E[j]) if (n / 2 < sz[k] && sz[k] <= sz[j]) valid = 0; if (valid) c = j; } cent.emplace_back(c); vis[c] = 2; for (auto [j, k] : E[c]) { pre[j] = k; subt.emplace_back(j); state[k] = 1; } } int nD = ask(state); for (int i = 0; i < N; i++) if (vis[i] == 1) vis[i] = 0; if (nD == D) continue; if (nD == D - A + B) { cerr << "S is centroid\n"; S = search(cent); cerr << "S is " << S << '\n'; break; } else { cerr << "S is in some subtree\n"; int rS = search(subt); cerr << "root of subtree is " << rS << '\n'; tree.clear(); dis[rS] = 0; dfs(rS); state = vector<int>(M, 0); for (int i : tree) for (auto [j, k] : E[i]) if (vis[j] == 1) state[k] = 1; ll dist = (ask(state) - D) / (B - A); vector<int> vD; for (int i : tree) if (dis[i] == dist) vD.emplace_back(i); S = search(vD); cerr << "S is " << S << '\n'; break; } } assert(t > 0); tree.clear(); for (int i = 0; i < N; i++) vis[i] = 0; dis[S] = 0; dfs(S); vector<int> vD; for (int i : tree) if (dis[i] * A == D) vD.emplace_back(i); int T = search(vD); cerr << "T is " << T << '\n'; answer(S, T); }

Compilation message (stderr)

highway.cpp: In function 'void dfs(int)':
highway.cpp:21:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   21 |     for (auto [v, i] : E[u])
      |               ^
highway.cpp: In function 'int search(std::vector<int>)':
highway.cpp:38:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |         for (auto [_, j] : E[i])
      |                   ^
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:68:35: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   68 |                         for (auto [k, _] : E[j])
      |                                   ^
highway.cpp:76:27: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   76 |                 for (auto [j, k] : E[c])
      |                           ^
highway.cpp:106:27: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  106 |                 for (auto [j, k] : E[i])
      |                           ^
#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...