Submission #846514

# Submission time Handle Problem Language Result Execution time Memory
846514 2023-09-07T17:05:22 Z vjudge1 KOVANICE (COI15_kovanice) C++17
100 / 100
168 ms 47480 KB
#include <bits/stdc++.h>
using namespace std;
//#define int long long

const int MAXN = 3e5 + 5;

#define ONLINE_JUDGE
#ifndef ONLINE_JUDGE
    #define OPEN freopen(".in", "r", stdin); \
                 freopen(".out", "w", stdout);
#else
    #define OPEN void(23);
#endif

struct DSU
{
    vector <int> par;
    DSU(int n)
    {
        par.resize(n);
        iota(par.begin(), par.end(), 0ll);
    }

    inline int get(int a)
    {
        return par[a] = (par[a] == a ? a : get(par[a]));
    }

    bool same(int u, int v)
    {
        return get(u) == get(v);
    }

    bool unite(int u, int v)
    {
        if(same(u, v)) return false;
        u = get(u), v = get(v);

        par[v] = u;
        return true;
    }
};

vector <int> adj[MAXN];
vector <int> compos[MAXN];
DSU dsu(MAXN);
vector <pair <int, int>> que;
vector <int> dists(MAXN, -1);
vector <int> colors(MAXN, -1);
vector <int> ans(MAXN, -1);

int dfsDist(int node)
{
    if(dists[node] != -1) return dists[node];
    dists[node] = 1;
    for(const int &child : adj[node])
    {
        dists[node] = max(dfsDist(child) +1, dists[node]);
    }

    return dists[node];
}

void dfsCol(int node, int col)
{
    colors[node] = col;
    for(const int &child : adj[node])
    {
        if(colors[child] == -1 && dists[child] == dists[node] -1) dfsCol(child, col +1);
    }
}

void solve()
{
    int n, m, v; cin >> n >> m >> v;
    for(int i = 1; i <= v; i++)
    {
        int u = 0, v = 0; char eq;
        cin >> u >> eq >> v;

        if(eq == '>') swap(u, v);
        if(eq == '=') dsu.unite(u, v);
        else que.emplace_back(u, v);
    }

    for(auto &[a, b] : que)
    {
        adj[dsu.get(a)].emplace_back(dsu.get(b));
    }

    for(int i = 1; i <= m; i++) dfsDist(i);

    for(int i = 1; i <= m; i++)
    {
        if(dists[i] == n) dfsCol(i, 1);
    }

    for(int i = 1; i <= m; i++) compos[dsu.get(i)].emplace_back(i);

    for(int i = 1; i <= m; i++) ans[i] = colors[i];

    for(int i = 1; i <= m; i++)
    {
        if(dsu.get(i) != i) continue;
        int col = colors[i];
        for(int &j : compos[i]) ans[j] = col;
    }

    for(int i = 1; i <= m; i++)
    {
        if(ans[i] == -1) cout << '?';
        else cout << 'K' << ans[i];
        cout << "\n";
    }

    return;
}

int32_t main()
{
    OPEN;

    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int t = 1; //cin >> t;
    while(t--)
    {
        solve();
    }
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 19292 KB Output is correct
2 Correct 8 ms 19292 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 58 ms 26404 KB Output is correct
2 Correct 56 ms 26576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 17 ms 20440 KB Output is correct
2 Correct 18 ms 20432 KB Output is correct
3 Correct 18 ms 20440 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 125 ms 32356 KB Output is correct
2 Correct 143 ms 36004 KB Output is correct
3 Correct 117 ms 35752 KB Output is correct
4 Correct 128 ms 41320 KB Output is correct
5 Correct 168 ms 47480 KB Output is correct