Submission #1264485

#TimeUsernameProblemLanguageResultExecution timeMemory
1264485biankOne-Way Streets (CEOI17_oneway)C++20
100 / 100
260 ms58428 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
#define foreach(it, c) for (auto it = begin(c); it != end(c); it++)
 
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

#define pb push_back
#define eb emplace_back

using vi = vector<int>;
using ll = long long;
using ld = long double;
using vll = vector<ll>;
using ii = pair<int, int>;

#define fst first
#define snd second

const int MAX_N = 1e5 + 9;
 
int timer = 0;
stack<int> st;
bool vis[MAX_N];
int val[MAX_N], low[MAX_N];
vi adj[MAX_N];
vector<vi> comps;
 
void dfs(int u, int p = -1) {
    vis[u] = true;
    val[u] = low[u] = ++timer;
    st.push(u);
    for (int v : adj[u]) if (v != p) {
        if (vis[v]) {
            low[u] = min(low[u], val[v]);
        } else {
            dfs(v, u);
            low[u] = min(low[u], low[v]);
            if (low[v] >= val[u]) {
                vi cmp{u};
                while (cmp.empty() || cmp.back() != v) {
                    cmp.push_back(st.top());
                    st.pop();
                }
                comps.push_back(cmp);
            }
        }
    }
}

const int MAX_K = 19;

vi g[2 * MAX_N];
int up[MAX_K][2 * MAX_N];
int depth[2 * MAX_N];
bool done[2 * MAX_N];
int parent[2 * MAX_N];

void dfs2(int u, int p = -1, int d = 0) {
    up[0][u] = p, done[u] = true;
    parent[u] = p, depth[u] = d;
    for (int v : g[u]) if (v != p) {
        dfs2(v, u, d + 1);
    }
}

int lca(int u, int v) {
    if (depth[u] < depth[v]) swap(u, v);
    int diff = depth[u] - depth[v];
    forn(i, MAX_K) if (diff >> i & 1) u = up[i][u];
    if (u == v) return u;
    dforn(i, MAX_K) if (up[i][u] != up[i][v]) {
        u = up[i][u], v = up[i][v];
    }
    return up[0][u];
}

int dp1[2 * MAX_N], dp2[2 * MAX_N];

void dfs3(int u) {
    done[u] = true;
    for (int v : g[u]) if (v != parent[u]) {
        if (!done[v]) dfs3(v);
        dp1[u] += dp1[v];
        dp2[u] += dp2[v];
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int n, m;
    cin >> n >> m;
    map<ii, int> id, cnt;
    forn(i, m) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        adj[u].pb(v);
        adj[v].pb(u);
        id[{u, v}] = i;
        cnt[minmax(u, v)]++;
    }
    forn(u, n) if (!vis[u]) dfs(u);
    vector<ii> bridges;
    forn(i, sz(comps)) {
        vi &cmp = comps[i];
        if (sz(cmp) == 1) continue;
        if (sz(cmp) == 2) {
            int u = cmp[0], v = cmp[1];
            if (cnt[minmax(u, v)] == 1) {
                if (!id.count(ii{u, v})) swap(u, v);
                bridges.eb(u, v);
                g[u].pb(v), g[v].pb(u);
                continue;
            }
        }
        for (int u : cmp) {
            g[n + i].pb(u);
            g[u].pb(n + i);
        }
    }
    forn(u, n + sz(comps)) {
        if (!done[u]) dfs2(u);
    }
    forn(i, MAX_K - 1) forn(j, n + sz(comps)) {
        if (up[i][j] == -1) up[i + 1][j] = -1;
        else up[i + 1][j] = up[i][up[i][j]];
    }
    int p;
    cin >> p;
    forn(i, p) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        int w = lca(u, v);
        dp1[u]++, dp2[v]++;
        dp1[w]--, dp2[w]--;
    }
    forn(u, n + sz(comps)) done[u] = false;
    forn(u, n + sz(comps)) {
        if (!done[u]) dfs3(u);
    }
    string ret(m, 'B');
    for (auto [u, v] : bridges) {
        int i = id[ii{u, v}];
        if (parent[u] == v) {
            if (dp1[u]) {
                ret[i] = 'R';
            } else if (dp2[u]) {
                ret[i] = 'L';
            }
        } else {
            assert(parent[v] == u);
            if (dp1[v]) {
                ret[i] = 'L';
            } else if (dp2[v]) {
                ret[i] = 'R';
            }
        }
    }
    cout << ret << '\n';
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...