Submission #1263817

#TimeUsernameProblemLanguageResultExecution timeMemory
1263817olocMin-max tree (BOI18_minmaxtree)C++20
29 / 100
125 ms47768 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int M = 3 * N + 1000; vector<pair<int, int>> graf[N], kraw; set<int> miny[N], maxy[N]; int licznik = N; vector<int> dwu[M]; unordered_map<int, int> mapa; vector<int> odz(M, -1); void dfs(int v, int ojc){ for(auto k : graf[v]){ int u = k.first; int ind = k.second; if(u != ojc){ dfs(u, v); if(!miny[u].empty()){ int a = *miny[u].rbegin(); if(mapa.find(a) != mapa.end()){ int tmp = mapa[a]; dwu[tmp].push_back(ind); dwu[ind].push_back(tmp); }else{ mapa[a] = licznik; odz[licznik] = a; dwu[ind].push_back(licznik); dwu[licznik].push_back(ind); licznik++; } // cout << u << " " << v << " " << a << " x\n"; } if(!maxy[u].empty()){ int a = *maxy[u].begin(); if(mapa.find(a) != mapa.end()){ int tmp = mapa[a]; dwu[tmp].push_back(ind); dwu[ind].push_back(tmp); }else{ mapa[a] = licznik; odz[licznik] = a; dwu[ind].push_back(licznik); dwu[licznik].push_back(ind); licznik++; } // cout << u << " " << v << " " << a << " y\n"; } if(miny[v].size() < miny[u].size()){ swap(miny[v], miny[u]); } for(int i : miny[u]){ if(miny[v].find(i) != miny[v].end()){ miny[v].erase(i); // cout << "u: " << u << " v: " << v << " w: " << i << " a\n"; continue; } miny[v].insert(i); } if(maxy[v].size() < maxy[u].size()){ swap(maxy[v], maxy[u]); } for(int i : maxy[u]){ if(maxy[v].find(i) != maxy[v].end()){ maxy[v].erase(i); // cout << "u: " << u << " v: " << v << " w: " << i << " \n"; continue; } maxy[v].insert(i); } } } } vector<int> match; vector<char> vis; bool powieksz(int v){ vis[v] = 1; for(int u : dwu[v]){ if(match[u] == -1){ match[u] = v; match[v] = u; return true; } } for(int u : dwu[v]){ if(match[u] != -1){ if(!vis[match[u]] && powieksz(match[u])){ match[u] = v; match[v] = u; return true; } } } return false; } void matching(int l){ match.assign(M, -1); vis.assign(l + 2, 0); while(true){ for(int u = 0; u <= l; u++) vis[u] = 0; bool any = false; for(int u = 0; u <= l; u++){ if(match[u] == -1 && !vis[u]){ if(powieksz(u) == true) any = true; } } if(!any) break; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; kraw.resize(n - 1); for(int i = 0; i < n - 1; i++){ int a, b; cin >> a >> b; kraw[i] = {a, b}; graf[a].push_back({b, i}); graf[b].push_back({a, i}); } int q; cin >> q; for(int i = 0; i < q; i++){ char znak; int a, b, c; cin >> znak >> a >> b >> c; if(znak == 'm'){ miny[a].insert(c); miny[b].insert(c); }else{ maxy[a].insert(c); maxy[b].insert(c); } } dfs(1, -1); // for(int i = 0; i < n - 1; i++){ // cout << "i: " << i << "\n"; // for(int j : dwu[i]){ // int val = odz[j]; // cout << j << " " << val << "\n"; // } // cout << "\n"; // } int l = n - 2; matching(l); // for(int i = 0; i <= n - 2; i++){ // cout << "i: " << i << " match: " << match[i] << "\n"; // } vector<int> wyn(n - 1, 0); for(int i = 0; i <= l; i++){ if(match[i] != -1){ int idx = match[i]; int val = odz[idx]; wyn[i] = val; } } for(int i = 0; i < n - 1; i++){ cout << kraw[i].first << " " << kraw[i].second << " " << wyn[i] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...