Submission #1292613

#TimeUsernameProblemLanguageResultExecution timeMemory
1292613yonatanlRigged Roads (NOI19_riggedroads)C++20
58 / 100
2095 ms57012 KiB
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <queue> #include <set> #include <map> #define rep(i, s, e) for (ll i = s; i < e; i++) #define upmax(a, b) a = max(a, b) #define upmin(a, b) a = min(a, b) using namespace std; using ll = long long; using vll = vector<ll>; using vvll = vector<vll>; using pll = pair<ll, ll>; using vpll = vector<pll>; using vvpll = vector<vpll>; const ll INF = 1e18; vll depth, par, ans; map<pll, ll> edges_idx; vvll tree; void dfs(ll node, ll papa) { for (auto& nei : tree[node]) { if (nei == papa) continue; depth[nei] = depth[node] + 1; par[nei] = node; dfs(nei, node); } } void path(ll a, ll b, vll& idx) { if (depth[b] > depth[a]) swap(a, b); while (depth[a] > depth[b]) { ll mn = min(a, par[a]); ll mx = max(a, par[a]); a = par[a]; ll i = edges_idx[{mn, mx}]; if (ans[i] == -1) { idx.push_back(i); } } while (a != b) { ll mn = min(a, par[a]); ll mx = max(a, par[a]); a = par[a]; ll i = edges_idx[{mn, mx}]; if (ans[i] == -1) { idx.push_back(i); } mn = min(b, par[b]); mx = max(b, par[b]); b = par[b]; i = edges_idx[{mn, mx}]; if (ans[i] == -1) { idx.push_back(i); } } } void solve() { ll n, m; cin >> n >> m; vpll edges(m); vector<bool> R(m); rep(i, 0, m) { cin >> edges[i].first >> edges[i].second; edges[i].first--, edges[i].second--; edges[i] = { min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second) }; edges_idx[edges[i]] = i; } tree.clear(), tree.resize(n); depth.clear(), depth.resize(n, 0); par.clear(), par.resize(n, -1); rep(i, 0, n - 1) { ll e; cin >> e; e--; R[e] = 1; tree[edges[e].first].push_back(edges[e].second); tree[edges[e].second].push_back(edges[e].first); } ans.clear(), ans.resize(m, -1); dfs(0, -1); ll curW = 1; rep(i, 0, m) { if (ans[i] != -1) continue; else if (R[i]) { ans[i] = curW; curW++; } else { vll idx; path(edges[i].first, edges[i].second, idx); sort(idx.begin(), idx.end()); rep(j, 0, idx.size()) { ans[idx[j]] = curW; curW++; } ans[i] = curW; curW++; } } rep(i, 0, m) cout << ans[i] << ' '; cout << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); solve(); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...