Submission #1308604

#TimeUsernameProblemLanguageResultExecution timeMemory
1308604BalsaOne-Way Streets (CEOI17_oneway)C++17
0 / 100
8 ms16184 KiB
#include <bits/stdc++.h>
using namespace std;

#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

using ll = long long;
const ll MAXN = 200005;

struct pair_hash {
    size_t operator()(const pair<ll, ll>& p) const {
        return ((p.fi << 32) | p.se);
    }
};

unordered_set<pair<ll, ll>, pair_hash> bridges;
unordered_multiset<pair<ll, ll>, pair_hash> edges_num;
vector<ll> edges[MAXN];
ll tin[MAXN], low[MAXN];
bool vis[MAXN];
ll timer = 0;

void dfsbd(ll v, ll p) {
    if (vis[v]) return;
    vis[v] = 1;

    tin[v] = low[v] = timer++;
    for (ll u : edges[v]) {
        if (u == p) continue;
        if (!vis[u]) {
            dfsbd(u, v);
            low[v] = min(low[v], low[u]);
            if (low[u] > tin[v] && edges_num.count({v, u}) == 1) bridges.insert({v, u});
        } else {
            low[v] = min(low[v], tin[u]);
        }
    }
}

ll who[MAXN];
void dfs_coloring(ll v, ll c) {
    if (vis[v]) return;
    vis[v] = 1;

    who[v] = c;

    for (ll u : edges[v]) {
        if (bridges.count({v, u}) || bridges.count({u, v})) continue;
        dfs_coloring(u, c);
    }
}

unordered_set<ll> wedges[MAXN];

bool dfs(ll v, ll p, ll dest) {
    if (vis[v]) return false;
    vis[v] = 1;
    if (v == dest) return true;

    for (ll u : wedges[v]) {
        if (u == p) continue;

        if (dfs(u, v, dest)) {
            // v----->u
            wedges[u].erase(v);
            return true;
        }
    }

    return false;
}

void solve() {
    ll n, m;
    cin >> n >> m;
    unordered_map<pair<ll, ll>, ll, pair_hash> edge2ind;
    for (ll i = 0; i < m; i++) {
        ll v, u;
        cin >> v >> u;
        v--, u--;
        edges[v].push_back(u);
        edges[u].push_back(v);
        edges_num.insert({v, u});
        edges_num.insert({u, v});

        edge2ind[{v, u}] = i;
        edge2ind[{u, v}] = i;
    }

    for (ll v = 0; v < n; v++) tin[v] = low[v] = 1e18;

    for (ll v = 0; v < n; v++) {
        if (vis[v]) continue;
        dfsbd(v, -1);
    }

    memset(vis, 0, sizeof(vis));
    ll comp_num = 0;
    for (ll v = 0; v < n; v++) {
        if (vis[v]) continue;
        dfs_coloring(v, comp_num);
        comp_num++;
    }

    unordered_map<pair<ll, ll>, tuple<ll, ll, char>, pair_hash> w2e;
    
    for (ll v = 0; v < n; v++) {
        for (ll u : edges[v]) {
            if (who[v] == who[u]) continue;
            wedges[who[v]].insert(who[u]);
            w2e[{who[v], who[u]}] = {v, u, 'R'};
            w2e[{who[u], who[v]}] = {u, v, 'L'};
        }
    }

    memset(vis, 0, sizeof(vis));
    ll p; cin >> p;
    while (p--) {
        ll v, u;
        cin >> v >> u;
        v--, u--;
        if (who[v] == who[u]) continue;

        dfs(who[v], -1, who[u]);
    }

    string ans(m, 'B');

    for (ll v = 0; v < comp_num; v++) {
        for (ll u : wedges[v]) {
            auto[a, b, dir] = w2e[{v, u}];
            if (dir == 'L') swap(a, b);
            ans[edge2ind[{a, b}]] = dir;
        }
    }

    cout << ans << '\n';
}

int main() {
    // freopen("promote.in", "r", stdin);
    // freopen("promote.out", "w", stdout);
 
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...