Submission #740402

#TimeUsernameProblemLanguageResultExecution timeMemory
740402danikoynovHighway Tolls (IOI18_highway)C++14
51 / 100
238 ms262144 KiB
#include "highway.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5 + 10; vector < pair < int, int > > g[maxn]; int n, m; ll a, b; pair < int, int > ed[maxn]; vector < int > turn_active(vector < int > act) { vector < int > res(m, 0); for (int v : act) res[v] = 1; return res; } int mark[maxn], from[maxn], dis[maxn]; void mark_vertices(int v, int p) { mark[v] = 1; for (pair < int, int > nb : g[v]) { if (nb.first == p) continue; from[nb.first] = nb.second; dis[nb.first] = dis[v] + 1; mark_vertices(nb.first, v); } } int used[maxn]; int find_under(int v, int p, ll len) { for (int i = 0; i < n; i ++) { used[i] = 0; mark[i] = 0, from[i] = 0, dis[i] = 0; } used[p] = 1; from[v] = -1; mark_vertices(v, p); vector < int > act; for (int i = 0; i < m; i ++) { if (mark[ed[i].first] && mark[ed[i].second]) act.push_back(i); } ll val = ask(turn_active(act)); ll nec = (val - len * a) / (ll)(b - a); act.clear(); for (int i = 0; i < n; i ++) { if (mark[i] && dis[i] == nec) act.push_back(from[i]), used[from[i]] = 1; } while(act.size() > 1) { vector < int > lf, rf; for (int i = 0; i < act.size() / 2; i ++) lf.push_back(act[i]); for (int i = act.size() / 2; i < act.size(); i ++) rf.push_back(act[i]); if (ask(turn_active(lf)) != len * a) act = lf; else act = rf; } int edge = act[0]; for (int i = 0; i < n; i ++) { if (mark[i] && dis[i] == nec && from[i] == edge) return i; } return -1 ; } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { n = N; m = U.size(); a = A; b = B; for (int i = 0; i < m; i ++) { g[U[i]].push_back({V[i], i}); g[V[i]].push_back({U[i], i}); ed[i] = {U[i], V[i]}; } vector < int > act; for (int i = 0; i < n - 1; i ++) act.push_back(i); ll num_edges = ask(turn_active(act)) / (ll)(B); while(act.size() > 1) { vector < int > lf, rf; for (int i = 0; i < act.size() / 2; i ++) lf.push_back(act[i]); for (int i = act.size() / 2; i < act.size(); i ++) rf.push_back(act[i]); if (ask(turn_active(lf)) != num_edges * (ll)(A)) act = lf; else act = rf; } int edge = act[0]; ///cout << "here " << edge << endl; int v = V[edge], u = U[edge]; int S = find_under(v, u, num_edges); int T = find_under(u, v, num_edges); ///cout << S << " " << T << " : " << v << " " << u << endl; answer(S, T); }

Compilation message (stderr)

highway.cpp: In function 'void mark_vertices(int, int)':
highway.cpp:28:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   28 |         if (nb.first == p)
      |         ^~
highway.cpp:30:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   30 |             from[nb.first] = nb.second;
      |             ^~~~
highway.cpp: In function 'int find_under(int, int, ll)':
highway.cpp:68:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         for (int i = 0; i < act.size() / 2; i ++)
      |                         ~~^~~~~~~~~~~~~~~~
highway.cpp:70:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |         for (int i = act.size() / 2; i < act.size(); i ++)
      |                                      ~~^~~~~~~~~~~~
highway.cpp:70:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   70 |         for (int i = act.size() / 2; i < act.size(); i ++)
      |         ^~~
highway.cpp:72:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   72 |             if (ask(turn_active(lf)) != len * a)
      |             ^~
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:111:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |         for (int i = 0; i < act.size() / 2; i ++)
      |                         ~~^~~~~~~~~~~~~~~~
highway.cpp:113:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |         for (int i = act.size() / 2; i < act.size(); 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...