제출 #1356477

#제출 시각아이디문제언어결과실행 시간메모리
1356477islam_2010KOVANICE (COI15_kovanice)C++20
100 / 100
143 ms33012 KiB

#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
const int sz = 3e5 + 5;

int n, m, q;
vector<int> g[sz];
int r[sz], par[sz];
vector<bool> used(sz);

int find_par(int node){
    if(node == par[node]){
        return node;
    }return par[node] = find_par(par[node]);
}


void unite(int u, int v){
    int par_u = find_par(u);
    int par_v = find_par(v);
    if(par_u == par_v){
        return;
    }
    if(r[par_u] < r[par_v]){
        swap(par_u, par_v);
    }par[par_v] = par_u;
    r[par_u] += r[par_v];
}

vector<int> tp;

void dfs(int node){
    used[node] = 1;
    for(auto i: g[node]){
        if(!used[i]){
            dfs(i);
        }
    }tp.push_back(node);
}


signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m >> q;
    
    for(int i = 1; i <= m; i++){
        r[i] = 1;
        par[i] = i;
    }
    vector<pair<int, int>> w;
    for(int i = 0; i < q; i++){
        int u, v;
        char c;
        cin >> u >> c >> v;
        if(c == '='){
            unite(u, v);
        }else {
            w.push_back({u, v});
        }
    }
    for(auto i: w){
        int par_u = find_par(i.first);
        int par_v = find_par(i.second);
        if(par_u != par_v){
            g[par_u].push_back(par_v);
        }
    }for(int i = 1; i <= m; i++){
        if(!used[i]){
            dfs(i);
        }
    }vector<int> suff(m+1, 0), pref(m+1, 0);
    for(auto i: tp){
        for(auto v: g[i]){
            suff[i] = max(suff[i], suff[v] + 1);
        }
    }reverse(tp.begin(), tp.end());
    for(auto i: tp){
        for(auto v: g[i]){
            pref[v] = max(pref[v], pref[i] + 1);
        }
    }
    for(int i = 1; i <= m; i++){
        int par_i = find_par(i);
        if(pref[par_i] + suff[par_i] + 1 == n){
            cout << 'K' << pref[par_i]+1 << endl;
        }else {
            cout << "?\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...