제출 #1257077

#제출 시각아이디문제언어결과실행 시간메모리
1257077nikaa123One-Way Streets (CEOI17_oneway)C++20
0 / 100
676 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define eb emplace_back
#define mp make_pair
#define pb push_back
#define pp pop_back
#define endl '\n'
#define ff first
#define ss second
#define sz(x) (int)x.size()

typedef pair<int, int> pii;

const int N = 1e5 + 5;
const int M = 2e5 + 5;

int n, m, p, a, b;
int visited[N];
int low[N], inT[N], outT[N];
int timer;
struct Edge { int to, id; };
vector<vector<Edge>> v(N), v1(N);
struct R { int a, b, id; };
vector<R> roads;

int up[N][20];
bool isbridge[M];
char ans[M];

int comp[N];
vector<int> lst;

void dfs1(int x, int p, int peid) {
    visited[x] = true;
    inT[x] = low[x] = timer++;
    for (auto e : v[x]) {
        int to = e.to, eid = e.id;
        if (eid == peid) continue;
        if (visited[to]) {
            low[x] = min(low[x], inT[to]);
        } else {
            dfs1(to, x, eid);
            low[x] = min(low[x], low[to]);
            if (low[to] > inT[x]) {
                isbridge[eid] = true;
                v1[to].pb({x, eid});
                v1[x].pb({to, eid});
            }
        }
    }
}

void dfs2(int x) {
    lst.pb(x);
    visited[x] = true;
    for (auto e : v[x]) {
        int to = e.to, eid = e.id;
        if (visited[to]) continue;
        if (isbridge[eid]) continue;
        dfs2(to);
    }
}

void dfs3(int x, int p) {
    inT[x] = timer++;
    up[x][0] = p;
    visited[x] = true;
    for (int i = 1; i <= 17; i++) {
        up[x][i] = up[up[x][i-1]][i-1];
    }
    for (auto e : v[x]) {
        int to = e.to;
        if (to == p) continue;
        dfs3(to, x);
    }
    outT[x] = timer++;
}

bool ispar(int a, int b) {
    return (inT[a] < inT[b] && outT[a] > outT[b]);
}

int lca(int a, int b) {
    if (ispar(a, b)) return a;
    if (ispar(b, a)) return b;
    for (int i = 17; i >= 0; i--) {
        if (!ispar(up[a][i], b)) {
            a = up[a][i];
        }
    }
    return up[a][0];
}

inline void test_case() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        cin >> a >> b;
        v[a].pb({b, i});
        v[b].pb({a, i});
        roads.pb({a, b, i});
        ans[i] = 'B';
    }
    for (int i = 1; i <= n; i++) {
        if (!visited[i]) dfs1(i, -1, -1);
    }
    for (int i = 1; i <= n; i++) visited[i] = false;
    int id = n + 1;
    for (int i = 1; i <= n; i++) {
        if (visited[i]) continue;
        lst.clear();
        dfs2(i);
        if (sz(lst) > 1) {
            for (auto x : lst) {
                comp[x] = id;
            }
        }
    }
    for (int i = 1; i <= n; i++) visited[i] = false;
    for (auto r : roads) {
        int a = r.a, b = r.b;
        for (auto e : v[a]) if (e.to == b) {
            if (!isbridge[e.id]) {
                if (comp[a]) {
                    v1[a].pb({comp[a], e.id});
                    v1[comp[a]].pb({a, e.id});
                }
                if (comp[b]) {
                    v1[b].pb({comp[b], e.id});
                    v1[comp[b]].pb({b, e.id});
                }
            }
            break;
        }
    }
    v = v1;
    for (int i = 1; i <= n; i++) visited[i] = false;
    timer = 0;
    for (int i = 1; i <= n; i++) {
        if (!visited[i]) dfs3(i, i);
    }
    cin >> p;
    while (p--) {
        cin >> a >> b;
        int l = lca(a, b);
        while (a != l) {
            int x = up[a][0];
            for (auto e : v[a]) if (e.to == x) {
                if (ans[e.id] == 'B') {
                    ans[e.id] = 'R';
                }
                break;
            }
            a = x;
        }
        while (b != l) {
            int x = up[b][0];
            for (auto e : v[b]) if (e.to == x) {
                if (ans[e.id] == 'B') {
                    ans[e.id] = 'L';
                }
                break;
            }
            b = x;
        }
    }
    for (auto r : roads) cout << ans[r.id];
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    test_case();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...