Submission #1209057

#TimeUsernameProblemLanguageResultExecution timeMemory
1209057abczzSimurgh (IOI17_simurgh)C++20
0 / 100
167 ms7976 KiB
#include "simurgh.h" #include <iostream> #include <vector> #include <array> #define ll long long using namespace std; ll W[250000]; ll N, z, D[500], X[500], Y[500], P[500], E[500], dsuP[500]; vector <array<ll, 3>> Z; vector <array<ll, 2> > adj[500]; void dfs(ll u, ll w) { D[u] = w; for (auto [v, x] : adj[u]) { if (D[v] == -1) { P[v] = u, E[v] = x; dfs(v, w+1); } else if (D[v] < D[u]-1 && D[v] < X[u]) { X[u] = D[v], Y[u] = x; } } } ll query(ll x, ll y) { vector <int> Q; for (auto [u, a, b] : Z) { if (u == x) Q.push_back(y); else Q.push_back(u); } return count_common_roads(Q); } ll dsu(ll u) { if (dsuP[u] == u) return u; else return dsuP[u] = dsu(dsuP[u]); } ll bsquery(ll u, vector <array<ll, 2>> V) { for (int i=0; i<N; ++i) dsuP[i] = i; vector <int> Q; ll w = 0; for (auto [x, y] : V) { ll a = dsu(u), b = dsu(x); dsuP[a] = b; Q.push_back(y); } for (auto [y, a, b] : Z) { a = dsu(a), b = dsu(b); if (a != b) { dsuP[a] = b; Q.push_back(y); w += W[y]; } } return count_common_roads(Q) - w; } void solve(ll u) { if (X[u] != 1e18) { vector <array<ll, 2> > V; ll v = u; while (D[v] != X[u] && W[E[v]] == -1) { V.push_back({E[v], 0}); v = P[v]; } for (int i=0; i<V.size(); ++i) { V[i][1] = query(V[i][0], Y[u]); } V.push_back({Y[u], z}); sort(V.begin(), V.end(), [](auto a, auto b) { return a[1] > b[1]; }); if (V[0][1] == V.back()[1]) { for (auto [x, y] : V) W[x] = 0; } else { for (int i=0; i<V.size(); ++i) { if (V[i][1] != V.back()[1]) W[V[i][0]] = 0; else W[V[i][0]] = 1; } } } for (auto [v, x] : adj[u]) { if (D[v] != D[u]+1) continue; solve(v); } } std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) { N = n; for (int i=0; i<n; ++i) D[i] = -1, X[i] = 1e18; for (int i=0; i<u.size(); ++i) { W[i] = -1; adj[u[i]].push_back({v[i], i}); adj[v[i]].push_back({u[i], i}); } P[0] = -1; dfs(0, 0); for (int i=1; i<n; ++i) Z.push_back({E[i], i, P[i]}); z = query(-1, -1); solve(0); for (int i=1; i<n; ++i) { if (W[E[i]] == -1) W[E[i]] = 1; } vector <int> F; for (int i=0; i<n; ++i) { vector <array<ll, 2> > V; for (auto [x, y] : adj[i]) { if (i < x) V.push_back({x, y}); } while (!V.empty()) { if (!bsquery(i, V)) break; ll l = 0, r = (ll)V.size()-1, mid; while (l < r) { mid = (l+r)/2; vector <array<ll, 2>> tmp; for (int j=l; j<=mid; ++j) tmp.push_back(V[j]); if (bsquery(i, tmp)) r = mid; else l = mid+1; } F.push_back(V[l][1]); swap(V[l], V[(ll)V.size()-1]); V.pop_back(); } } return F; }
#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...