Submission #1330853

#TimeUsernameProblemLanguageResultExecution timeMemory
1330853paronmanukyanKOVANICE (COI15_kovanice)C++20
0 / 100
34 ms21072 KiB
#include <bits/stdc++.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;

#define all(x) x.begin(), x.end()
#define ll long long
#define pii pair<int,int>
#define V vector
#define pb push_back
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr);

const int N = 3e5 + 5;

int bg[N], sm[N];
V<pii> adjb[N], adjs[N];
bool v[N];

void dfs1(int node, V<bool>& vis) {
    vis[node] = true;
    v[node] = true;

    for (auto [i, bs] : adjb[node])
        if (!vis[i])
            dfs1(i, vis);

    for (auto [i, bs] : adjb[node])
        bg[i] = max(bg[i], bg[node] + bs);
}

void dfs2(int node, V<bool>& vis) {
    vis[node] = true;
    v[node] = true;

    for (auto [i, bs] : adjs[node])
        if (!vis[i])
            dfs2(i, vis);

    for (auto [i, bs] : adjs[node])
        sm[i] = max(sm[i], sm[node] + bs);
}

void reun(int node, V<bool>& vis) {
    vis[node] = true;
    v[node] = true;

    for (auto [i, bs] : adjb[node])
        if (!vis[i])
            reun(i, vis);

    for (auto [i, bs] : adjb[node]) {
        if (bs == 0) {
            int mx_bg = max(bg[i], bg[node]);
            int mx_sm = max(sm[i], sm[node]);
            bg[i] = bg[node] = mx_bg;
            sm[i] = sm[node] = mx_sm;
        }
    }
}

int main() {
    FASTIO

    int n, m, q; 
    cin >> n >> m >> q;

    V<pii> b, s, e;

    for (int i = 1; i <= q; i++) {
        int a, c;
        char x;
        cin >> a >> c >> x;

        if (x == '>') {
            b.pb({a, c});
            s.pb({c, a});
        }
        else if (x == '<') {
            s.pb({a, c});
            b.pb({c, a});
        }
        else
            e.pb({a, c});
    }

    for (auto [x, y] : b)
        adjb[x].pb({y, 1});

    for (auto [x, y] : e) {
        adjb[x].pb({y, 0});
        adjb[y].pb({x, 0});
        adjs[x].pb({y, 0});
        adjs[y].pb({x, 0});
    }

    for (int i = 1; i <= m; i++) v[i] = false;
    V<bool> vis1(m + 1, false);
    for (int i = 1; i <= m; i++)
        if (!v[i])
            dfs1(i, vis1);

    for (int i = 1; i <= m; i++) v[i] = false;
    V<bool> vis2(m + 1, false);
    for (int i = 1; i <= m; i++)
        if (!v[i])
            dfs2(i, vis2);

    for (int i = 1; i <= m; i++) v[i] = false;
    V<bool> vis3(m + 1, false);
    for (int i = 1; i <= m; i++)
        if (!v[i])
            reun(i, vis3);

    for (int i = 1; i <= m; i++) {
        if (bg[i] + sm[i] == n - 1)
            cout << 'K' << sm[i] + 1 << "\n";
        else
            cout << "?\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...