제출 #1133378

#제출 시각아이디문제언어결과실행 시간메모리
1133378GrayMin-max tree (BOI18_minmaxtree)C++20
0 / 100
1097 ms26440 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define ld long double #define ff first #define ss second #define ln "\n" #define mp make_pair #define INF 2e18 #define MOD 1e9+7 vector<pair<ll, ll>> up; vector<vector<ll>> add, A; vector<pair<ll, ll>> e, bound; void dfs(ll u, ll p, set<pair<ll, ll>> &upMN, set<pair<ll, ll>> &upMX){ set<pair<ll, ll>> tupMN, tupMX; bool first=1; for (auto i:A[u]){ ll v = e[i].ff^e[i].ss^u; if (v==p) continue; if (first){ dfs(v, u, upMN, upMX); if (!upMN.empty()) bound[i].ff = (*upMN.rbegin()).ss; if (!upMX.empty()) bound[i].ss = (*upMX.begin()).ss; first=0; }else{ tupMN.clear(); tupMX.clear(); dfs(v, u, tupMN, tupMX); if (!tupMN.empty()) bound[i].ff = (*tupMN.rbegin()).ss; if (!tupMX.empty()) bound[i].ss = (*tupMX.begin()).ss; for (auto ch:tupMN){ if(upMN.count(ch)) upMN.erase(ch); else upMN.insert(ch); } for (auto ch:tupMX){ if (upMX.count(ch)) upMX.erase(ch); else upMX.insert(ch); } } } for (auto i:add[u]){ if (up[i].ff){ if (upMN.count({up[i].ss, i})) upMN.erase({up[i].ss, i}); else upMN.insert({up[i].ss, i}); }else { if (upMX.count({up[i].ss, i})) upMX.erase({up[i].ss, i}); else upMX.insert({up[i].ss, i}); } } } struct Kuhn{ vector<vector<ll>> A; vector<ll> match, vis; ll na, nb; Kuhn(ll _na, ll _nb){ na=_na; nb=_nb; match.resize(nb, -1); A.resize(na); } void add_edge(ll u, ll v){ A[u].push_back(v); } bool try_kuhn(ll u){ if (vis[u]) return 0; vis[u]=1; for (auto v:A[u]){ if (match[v]==-1 or try_kuhn(v)){ match[v]=u; return 1; } } return 0; } void run(){ for (ll i=0; i<na; i++){ vis.assign(na, 0); try_kuhn(i); } } }; void solve(){ ll n; cin >> n; A.resize(n+1); e.resize(n-1); bound.resize(n-1, {-1, -1}); for (ll i=0; i<n-1; i++){ ll u, v; cin >> u >> v; e[i] = {u, v}; A[u].push_back(i); A[v].push_back(i); } ll k; cin >> k; up.resize(k); add.resize(n+1); for (ll i=0; i<k; i++){ char typ; ll u, v, w; cin >> typ >> u >> v >> w; up[i] = {typ=='m', w}; add[u].push_back(i); add[v].push_back(i); } set<pair<ll, ll>> upMN, upMX; dfs(1, 1, upMN, upMX); Kuhn match(k, n-1); for (ll i=0; i<n-1; i++){ if (bound[i].ff!=-1) match.add_edge(bound[i].ff, i); if (bound[i].ss!=-1) match.add_edge(bound[i].ss, i); } // for (ll i=0; i<n-1; i++){ // cout << bound[i].ff << " " << bound[i].ss << ln; // } match.run(); for (ll i=0; i<n-1; i++){ cout << e[i].ff << " " << e[i].ss << " "; if (match.match[i]==-1) cout << (bound[i].ff!=-1?up[bound[i].ff].ss:0) << ln; else cout << up[match.match[i]].ss << ln; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); auto start = chrono::high_resolution_clock::now(); ll t=1; // cin >> t; while (t--) solve(); #ifdef LOCAL auto duration = chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now() - start); cout << setprecision(0) << fixed << "time: " << (double)duration.count()/1000.0 << " milliseconds" << endl; #endif }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...