Submission #1259804

#TimeUsernameProblemLanguageResultExecution timeMemory
1259804vuvietOne-Way Streets (CEOI17_oneway)C++20
0 / 100
4 ms8256 KiB
/**
 *  __      __   __      __
 *  \ \    / /   \ \    / (_)     _____
 *   \ \  / /_   _\ \  / / _  ___|_   _|
 *    \ \/ /| | | |\ \/ / | |/ _ \ | |
 *     \  / | |_| | \  /  | |  __/ | |
 *      \/   \__,_|  \/   |_|\____||_|
 *
 *     Author:    ~Noah-kun~
 *     Created:   2025-08-17 22:18
**/

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define ____VuViet__ signed main

const int N = 1e5 + 5;
typedef pair<int, int> pii;

int cnt = 0, n, m, k, dd[N];
int comp[N], sum[N], res[N], vis[N];

vector<pii> g1[N], g2[N], dag[N];
deque<int> dq;

void AddEdge(int u, int v, int i)
{
    g1[u].push_back({v, i});
    g2[v].push_back({u, i});
}

void ReadData()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int u, v;
        cin >> u >> v;
        AddEdge(u, v, i);
        AddEdge(v, u, -i);
    }
}

void Scan(int u, int p)
{
    dd[u] = 1;
    for (auto [v, id] : g1[u])
        if (!dd[v] && id != -p)
            Scan(v, id);
    dq.push_front(u);
}

void Enum(int u, int p)
{
    dd[u] = 1, comp[u] = cnt;
    for (auto [v, id] : g2[u])
        if (!dd[v] && id != -p)
            Enum(v, id);
}

void Kosaraju()
{
    for (int u = 1; u <= n; ++u)
        if (!dd[u])
            Scan(u, u);
    memset(dd, 0, sizeof(dd));
    for (int u : dq)
    {
        if (dd[u]) continue;
        ++cnt; Enum(u, u);
    }
}

void DFS(int u, int edgeId, int way)
{
    vis[u] = 1;
    for (auto [v, id] : dag[u])
    {
        if (vis[v]) continue;
        int nextWay = (id > 0) ? 1 : -1;
        DFS(v, abs(id), nextWay);
        sum[u] += sum[v];
    }
    if (sum[u] != 0 && edgeId != 0) {
        res[edgeId] = (sum[u] * way > 0) ? 1 : 2;
    }
}

char GetChar(int x)
{
    if (x == 0) return 'B';
    if (x == 1) return 'L';
    return 'R';
}

void Solve()
{
    Kosaraju();
    for (int u = 1; u <= n; u++)
        for (auto [v, id] : g1[u])
            if (comp[u] != comp[v])
                dag[comp[u]].push_back({comp[v], id});
    cin >> k;
    while (k--)
    {
        int u, v;
        cin >> u >> v;
        ++sum[comp[u]], --sum[comp[v]];
    }
    for (int i = 1; i <= cnt; i++)
        if (!vis[i])
            DFS(i, 0, 0);
    for (int i = 1; i <= m; i++)
        cout << GetChar(res[i]);
}

____VuViet__()
{
    ReadData();
    Solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...