Submission #1263754

#TimeUsernameProblemLanguageResultExecution timeMemory
1263754olocMin-max tree (BOI18_minmaxtree)C++20
0 / 100
86 ms36676 KiB
#include<bits/stdc++.h> using namespace std; const int N = 7e4 + 5; vector<pair<int, int>> graf[N], kraw; set<int> miny[N], maxy[N]; int licznik = N; vector<int> dwu[3 * N + 1000]; vector<int> odz(3 * N + 1000); 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); int akt = ind + 1; if(!miny[v].empty()){ auto it = miny[v].rbegin(); int a = *it; dwu[akt].push_back(licznik); dwu[licznik].push_back(akt); odz[licznik] = a; licznik++; } if(!maxy[v].empty()){ auto it = maxy[v].begin(); int a = *it; dwu[akt].push_back(licznik); dwu[licznik].push_back(akt); odz[licznik] = a; licznik++; } 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); 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); 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){ int mv = match[u]; if(mv > 0 && !vis[mv] && powieksz(mv)){ match[u] = v; match[v] = u; return true; } } } return false; } void matching(int l){ match.assign(3 * N + 1000, -1); vis.assign(l + 2, 0); while(true){ for(int u = 1; u <= l; u++) vis[u] = 0; bool any = false; for(int u = 1; u <= l; u++){ if(match[u] == -1 && !vis[u]){ if(powieksz(u)) any = true; } } if(!any) break; } } int main(){ ios::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, 0); int l = n - 1; matching(l); vector<int> wyn(n - 1, 0); for(int i = 1; i <= l; i++){ if(match[i] != -1){ int val = odz[match[i]]; wyn[i - 1] = 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...