제출 #1342604

#제출 시각아이디문제언어결과실행 시간메모리
1342604uroskMin-max tree (BOI18_minmaxtree)C++20
0 / 100
144 ms34032 KiB
#include "bits/stdc++.h"

#define dbg(X) cerr<<#X<<": "<<X<<'\n'

#define cer(v_) {cerr<<#v_<<": "; for(ll i_ : v_) cerr<<i_<< " ";cerr<<'\n';}
using namespace std;

using ll = int;

const ll maxn = 140005;
const ll lg = 20;
ll n,q;
vector<ll> g[maxn];
vector<ll> add[maxn][2];
vector<ll> del[maxn][2];
set<ll> s[2];
ll st[lg][maxn];
ll in[maxn],out[maxn],ti = 0;
ll deg[maxn];
bool intree(ll x,ll y){return in[x]<=in[y]&&out[x]>=out[y];}
ll lca(ll x,ll y){
    if(intree(x,y)) return x;
    if(intree(y,x)) return y;
    for(ll j = lg-1;j>=0;j--){
        if(!intree(st[j][x],y)) x = st[j][x];
    }
    return st[0][x];
}
void dfs(ll u,ll p){
    in[u] = ++ti;
    st[0][u] = p;
    for(ll s : g[u]){
        if(s==p) continue;
        dfs(s,u);
    }
    out[u] = ti;
}
vector<ll> v[2*maxn];
map<ll,ll> id;
bool oki = 1;
void adde(ll u,ll s){
    v[u].push_back(s);
    v[s].push_back(u);
    deg[u]++;
    deg[s]++;
}
void dfs2(ll u,ll p){
    ll mx = 1000000000,mn = 0;
    if(!s[1].empty()){
        adde(u,id[*s[1].begin()]+n);
        mx = *s[1].begin();
    }
    if(!s[0].empty()){
        adde(u,id[*prev(s[0].end())]+n);
        mn = *prev(s[0].end());
    }
    if(mn>mx) oki = 0;
    for(ll e = 0;e<2;e++){
        for(ll x : add[u][e]){
            s[e].insert(x);
        }
    }
    for(ll e = 0;e<2;e++){
        for(ll x : del[u][e]){
            s[e].erase(x);
        }
    }
    for(ll s : g[u]){
        if(s==p) continue;
        dfs2(s,u);
    }
    for(ll e = 0;e<2;e++){
        for(ll x : del[u][e]){
            s[e].insert(x);
        }
    }
    for(ll e = 0;e<2;e++){
        for(ll x : add[u][e]){
            s[e].erase(x);
        }
    }
}
ll itr[maxn];
ll val[maxn];
ll koj[maxn];
bool vis[maxn];
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    for(ll i = 1;i<n;i++){
        ll x,y; cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1,1);
    for(ll j = 1;j<lg;j++){
        for(ll i = 1;i<=n;i++) st[j][i] = st[j-1][st[j-1][i]];
    }
    cin >> q;
    for(ll i = 1;i<=q;i++){
        char tip; ll x,y,z;
        cin >> tip >> x >> y >> z;
        id[z] = i;
        val[i] = z;
        ll up = lca(x,y);
        if(x==up||y==up){
            add[up][tip=='M'].push_back(z);
            del[x^y^up][tip=='M'].push_back(z);
        }else{
            add[up][tip=='M'].push_back(z);
            del[x][tip=='M'].push_back(z);
            del[y][tip=='M'].push_back(z);
        }
    }
    dfs2(1,1);
    if(!oki){
        cout<<-1<<'\n';
        return 0;
    }
    iota(itr+1,itr+1+q,n+1);
    sort(itr+1,itr+1+q,[](ll i,ll j){
        return v[i].size()<v[j].size();
    });
    queue<ll> qu;
    ll j = 1;
    while(!qu.empty()||j<=q){
        if(!qu.empty()){
            ll u = qu.front(); qu.pop();
            if(vis[u]) continue;
            for(ll s : v[u]){
                if(koj[s]==0){
                    koj[s] = u;
                    vis[u] = 1;
                    for(ll f : v[s]){
                        deg[f]--;
                        if(deg[f]==1){
                            qu.push(f);
                        }
                    }
                    break;
                }
            }
            if(!vis[u]) oki = 0;
        }else{
            ll u = itr[j]; j++;
            if(vis[u]) continue;
            for(ll s : v[u]){
                if(koj[s]==0){
                    koj[s] = u;
                    vis[u] = 1;
                    for(ll f : v[s]){
                        deg[f]--;
                        if(deg[f]==1){
                            qu.push(f);
                        }
                    }
                    break;
                }
            }
            if(!vis[u]) oki = 0;
        }
    }
    if(!oki){
        cout<<-1<<'\n';
        return 0;
    }
    for(ll i = 2;i<=n;i++){
        ll j = st[0][i];
        if(koj[i]==0) koj[i] = n;
        cout<<i<< " "<<j<< " "<<val[koj[i]-n]<<'\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...