Submission #1319448

#TimeUsernameProblemLanguageResultExecution timeMemory
1319448lernKOVANICE (COI15_kovanice)C++20
100 / 100
150 ms33032 KiB
#include <bits/stdc++.h>
using namespace std;
struct DSU{
    vector<int> p;
    void init(int n) {
        p.assign(n, -1);
    }
    int get(int a) {
        if (p[a] < 0) return a;
        return p[a] = get(p[a]);
    }
    bool unite(int a, int b) {
        a = get(a);
        b = get(b);
        if (a == b) return false;
        if (p[a] > p[b]) swap(a, b);
        p[a] += p[b];
        p[b] = a;
        return true;
    }
};
vector<int> L,R;
vector<vector<int>> gl,gr;
int dfsl(int node){
    if (L[node] != -1) return L[node];
    int res = 1;
    for (int i : gl[node]) {
        res = max(res, 1 + dfsl(i));
    }
    return L[node] = res;
}
int dfsr(int node){
    if (R[node] != -1) return R[node];
    int res = 1;
    for (int i : gr[node]) {
        res = max(res, 1 + dfsr(i));
    }
    return R[node] = res;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, v;
    cin>>n>>m>>v;
    DSU dsu;
    dsu.init(m);
    L.assign(m, -1);
    R.assign(m, -1);
    gl.assign(m, {});
    gr.assign(m, {});
    vector<pair<int,int>> queries;
    for (int i = 0; i < v; i++) {
        int a,b;
        char c;
        cin>>a>>c>>b;
        a--;
        b--;
        if (c == '=') {
            dsu.unite(a, b);
        }
        else {
            queries.push_back({a, b});
        }
    }
    for (auto &q : queries) {
        int a = dsu.get(q.first);
        int b = dsu.get(q.second);
        if (a != b) {
            gr[a].push_back(b);
            gl[b].push_back(a);
        }
    }
    for (int i = 0; i < m; i++) {
        int root = dsu.get(i);
        int left = dfsl(root);
        int right = dfsr(root);
        if ((left + right) == (n + 1)) {
            cout<<"K"<<left<<"\n";
        }
        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...