제출 #1263832

#제출 시각아이디문제언어결과실행 시간메모리
1263832olocMin-max tree (BOI18_minmaxtree)C++20
29 / 100
156 ms116452 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;
const int M = 3 * N + 1000;

vector<pair<int, int>> graf[M], kraw;
set<int> miny[M], maxy[M];
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++;
                }
            }
            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++;
                }
            }
            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){
            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(M, 0);
    while(true){
        vis.assign(M, 0);
        bool any = false;
        for(int u = 0; u <= l; u++){
            if(match[u] == -1 && !vis[u]){
                if(powieksz(u)) 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);

    int l = n - 2;
    matching(l);

    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 == -1 ? 0 : 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...