Submission #1248691

#TimeUsernameProblemLanguageResultExecution timeMemory
1248691NafeeszxOne-Way Streets (CEOI17_oneway)C++20
100 / 100
57 ms15176 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define trav(a, x) for(auto& a : x)
#define FOR(i, a, b) for (int i=(a); i<=(signed)(b); i++)
#define ROF(i, a, b) for (int i=(a); i>=(signed)(b); i--)
#define F0R(i, a) for (int i=0; i<(signed)(a); i++)
#define vi vector<int>
#define f first
#define s second
#define all(v) (v).begin(), (v).end()
typedef long long ll;

const ll mod = 1e9 + 7;

int main() 
{	
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, m; cin >> n >> m;
    vector<pair<int, int>> ed(m);
    vector<vector<pair<int, int>>> adj(n);
    map<pair<int, int>, int> cnt;
    F0R(_, m) {
        int u, v; cin >> u >> v;
        u--; v--;
        adj[u].emplace_back(v, _);
        adj[v].emplace_back(u, _);
        ed[_] = {u, v};
    }
    vector<int> vis(n);
    vector<int> num(n), low(n), bridge(m);
    int timer = 0;
    auto dfs1 = [&] (auto dfs1, int u, int p = -1)-> void {
        vis[u] = 1;
        num[u] = low[u] = ++timer;
        bool mul_ed = false;
        for(auto [v, id] : adj[u])  {
            if(v==p && !mul_ed) {
                mul_ed = true;
                continue;
            }
            if(vis[v]) {
                low[u] = min(low[u], num[v]); 
            }
            else {
                dfs1(dfs1, v, u);
                low[u] = min(low[u], low[v]);
                if(low[v]==num[v]) {
                    bridge[id] = 1;
                    // cout << id << "\n";
                }
            }
        } 
    };
    F0R(i, n) if(!vis[i]) dfs1(dfs1, i);
    vector<int> d2(n);
    int p; cin >> p;
    F0R(i, p) {
        int u, v; cin >> u >> v;
        u--; v--;
        d2[u]++;
        d2[v]--;
    }
    // F0R(i, n) cout << d2[i] << " ";
    // cout << "\n";
    vis = vector<int>(n);
    vector<char> ans(m, 'B');
    auto dfs2 = [&] (auto dfs2, int u) -> void {
        vis[u]=1;
        for(auto [v, id] : adj[u]) if(!vis[v]) {
            dfs2(dfs2, v);
            d2[u] += d2[v];
            if(!bridge[id] || !d2[v]) continue;
            if(d2[v] > 0 && ed[id].f == u || d2[v] < 0 && ed[id].f == v) ans[id] = 'L';
            else ans[id] = 'R';
        }
    };
    F0R(i, n) if(!vis[i]) dfs2(dfs2, i);
    // F0R(i, n) cout << d1[i] << " ";
    // cout << "\n";
    // F0R(i, n) cout << d2[i] << " ";
    // cout << "\n";
    trav(u, ans) cout << u;
    cout << '\n';
    return 0;
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...