Submission #1149904

#TimeUsernameProblemLanguageResultExecution timeMemory
1149904dostsOne-Way Streets (CEOI17_oneway)C++20
30 / 100
47 ms21444 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e17,N = 1e5+1,MOD = 1e9+7,BL = 1000;


vector<pii> edges[N];
vi bridge(N,0),tree(N),tin(N,0),low(N,0),comp(N,0),dp(N,0),realedg[N],tout(N);

int timer = 1;
void dfs(int node,int id,int treeid) {
    tree[node] = treeid;
    tin[node] = low[node] = timer++;
    for (auto it : edges[node]) {
        if (it.ss == id) continue;
        if (!tin[it.ff]) {
            dfs(it.ff,it.ss,treeid);
            if (low[it.ff] >= tin[it.ff]) bridge[it.ss] = 1;
        }
        low[node] = min(low[node],low[it.ff]);
    }
}

void dfs2(int node,int compid) {
    if (comp[node]) return;
    comp[node] = compid;
    for (auto it : edges[node]) {
        if (!bridge[it.ss]) dfs2(it.ff,compid);
    }
}

void dfs3(int node,int p) {
    tin[node] = timer++;
    for (auto it : realedg[node]) {
        if (it == p) continue;
        dfs3(it,node);
    }
    tout[node] = timer-1;
}

bool anc(int a,int b) {
    return tin[a] <= tin[b] && tout[a] >= tout[b];
}

void dfs4(int node,int p) {
    for (auto it : realedg[node]) {
        if (it == p) continue;
        dfs4(it,node);
        dp[node]+=dp[it];
    }
}

void solve() { 
    int n,m;
    cin >> n >> m;
    vector<pii> edg(m+1);
    for (int i=1;i<=m;i++) {
        int a,b;
        cin >> a >> b;
        edg[i] = {a,b};
        edges[a].push_back({b,i});
        edges[b].push_back({a,i});
    } 
    int ctr = 0;
    for (int i=1;i<=n;i++) {
        if (tin[i]) continue;
        dfs(i,-1,++ctr);
    }
    ctr = 0;
    for (int i=1;i<=n;i++) {
        if (comp[i]) continue;
        dfs2(i,++ctr);
    }
    for (int i=1;i<=m;i++) {
        if (!bridge[i]) continue;
        assert(comp[edg[i].ff] != comp[edg[i].ss]);
        realedg[comp[edg[i].ff]].push_back(comp[edg[i].ss]);
        realedg[comp[edg[i].ss]].push_back(comp[edg[i].ff]);
    }
    timer = 1;
    dfs3(1,1);
    int q;
    cin >> q;
    while (q--) {
        int a,b;
        cin >> a >> b;
        int x = comp[a],y = comp[b];
        dp[x]++;
        dp[y]--;
    }
    dfs4(1,1);
    for (int i=1;i<=m;i++) {
        if (comp[edg[i].ff] == comp[edg[i].ss]) {
            cout << 'B';
            continue;
        }
        int swp = 0;
        int x = comp[edg[i].ff],y = comp[edg[i].ss];
        //cout << x sp y << '\n';
        if (anc(x,y)) swap(x,y),swp = 1;
        if (dp[x] == 0) {
            cout << 'B';
            continue;
        }
        char up = 'R';
        char down = 'L';
        if (swp) swap(up,down);
        cout << ((dp[x] >= 1) ? up : down);
    }
    cout << '\n';
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...