제출 #769762

#제출 시각아이디문제언어결과실행 시간메모리
769762BlagojOne-Way Streets (CEOI17_oneway)C++17
100 / 100
119 ms38348 KiB
#include <bits/stdc++.h>

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

#pragma GCC optimize("Ofast,unroll-loops")

using namespace std;

#define endl '\n'
#define ll long long
#define all(x) x.begin(), x.end()

vector<int> g[100005];
stack<int> s;
unordered_set<int> cgr[100005];
int Time = 0, scc = 0, id[100005], tim[100005], low[100005], val[100005], dist[100005];
bool ins[100005];

void tarjan(int n, int p) {
    tim[n] = low[n] = ++Time;
    s.push(n);
    ins[n] = 1;
    for (auto x : g[n]) {
        if (x == p) {
            p = -1;
            continue;
        }
        if (tim[x] == 0) {
            tarjan(x, n);
            low[n] = min(low[n], low[x]);
        }
        else if (ins[x]) low[n] = min(low[n], tim[x]);
    }
    if (tim[n] == low[n]) {
        while (s.top() != n) {
            id[s.top()] = scc;
            ins[s.top()] = 0;
            s.pop();
        }
        id[s.top()] = scc;
        ins[s.top()] = 0;
        s.pop();
        scc++;
    }
}

void dfs(int n, int p) {
    for (auto x : cgr[n]) {
        if (x == p) continue;
        dist[x] = dist[n] + 1;
        dfs(x, n);
        val[n] += val[x];
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m;
    cin >> n >> m;
    int f[m], t[m];
    for (int i = 0; i < m; i++) {
        cin >> f[i] >> t[i];
        g[f[i]].push_back(t[i]);
        g[t[i]].push_back(f[i]);
    }
    for (int i = 1; i <= n; i++) if (!tim[i]) tarjan(i, -1);
    for (int i = 0; i < m; i++) {
        if (id[f[i]] != id[t[i]]) {
            cgr[id[f[i]]].insert(id[t[i]]);
            cgr[id[t[i]]].insert(id[f[i]]);
        }
    }
    int p;
    cin >> p;
    for (int i = 0; i < p; i++) {
        int a, b;
        cin >> a >> b;
        val[id[a]]++;
        val[id[b]]--;
    }
    for (int i = 0; i < scc; i++) if (dist[i] == 0) dfs(i, -1);
    for (int i = 0; i < m; i++) {
        int a = id[f[i]], b = id[t[i]];
        if (a == b) cout << "B";
        if (dist[a] > dist[b]) {
            if (val[a] > 0) cout << "R";
            if (val[a] == 0) cout << "B";
            if (val[a] < 0) cout << "L";
        }
        if (dist[a] < dist[b]) {
            if (val[b] > 0) cout << "L";
            if (val[b] == 0) cout << "B";
            if (val[b] < 0) cout << "R";
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...