Submission #1244039

#TimeUsernameProblemLanguageResultExecution timeMemory
1244039Born_To_LaughOne-Way Streets (CEOI17_oneway)C++17
0 / 100
2 ms5184 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(Lotus) Lotus.begin(), Lotus.end()
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7;
#define int ll
const int maxn = 1e5 + 10;
int n, m;
bool isbridge[maxn], ismulti[maxn];
int tin[maxn], low[maxn], comp[maxn];
int binlift[maxn][20];
vector<pair<int,int>> adj[maxn];
vector<int> bcadj[maxn];
int sum1[maxn], sum2[maxn];
int dep[maxn];
pair<int,int> edges[maxn];
map<pair<int,int>, int> mp;
/*
sum1 > 0 => up
sum2 > 0 => down
*/
int id = 0;
void tarjan(int a, int par){
    tin[a] = low[a] = ++id;
    for(auto &edge: adj[a]){
        int elm = edge.first;
        if(elm == par)continue;
        if(!tin[elm]){
            tarjan(elm, a);
            low[a] = min(low[a], low[elm]);
            if(low[elm] == tin[elm] && !ismulti[edge.second]){
                isbridge[edge.second] = 1;
                // cout <<edge.second << " cc\n";
            }
        }
        else low[a] = min(low[a], tin[elm]);
    }
}
void dfsmark(int a, int par){
    comp[a] = id;
    for(auto &edge: adj[a]){
        int elm = edge.first;
        if(elm == par || comp[elm] || isbridge[edge.second])continue;
        dfsmark(elm, a);
    }
}
void dfsbctree(int a, int par){
    for(auto &elm: bcadj[a]){
        if(elm == par)continue;
        dep[elm] = dep[a] + 1;
        binlift[elm][0] = a;
        for(int i=1; i<=n; ++i){
            binlift[elm][i] = binlift[binlift[elm][i-1]][i-1];
        }
        dfsbctree(elm, a);
        sum1[a] += sum1[elm];
        sum2[a] += sum2[elm];
    }
}
int lca(int a, int b){
    if(dep[a] < dep[b])swap(a, b);
    int k = dep[a] - dep[b];
    for(int i=0; i<20; ++i){
        if(k & (1 << i))a = binlift[a][i];
    }
    if(a == b)return a;
    for(int i=19; i>=0; --i){
        if(binlift[a][i] != binlift[b][i]){
            a = binlift[a][i];
            b = binlift[b][i];
        }
    }
    return binlift[a][0];
}
void dfscalans(int a, int par){
    for(auto &elm: bcadj[a]){
        if(elm == par)continue;
        dfscalans(elm, a);
        sum1[a] += sum1[elm];
        sum2[a] += sum2[elm];
    }
}
map<int, vector<int>> pos;
void solve(){
    cin >> n >> m;
    for(int i=1; i<=m; ++i){
        int a, b;cin >> a >> b;
        adj[a].push_back({b, i});
        adj[b].push_back({a, i});
        edges[i] = {a, b};
        pos[{min(a, b) << 32 | max(a, b)}].push_back(i);
    }
    for(auto &elm: pos){
        if(elm.second.size() > 1){
            for(auto &sth: elm.second){
                ismulti[sth] = 1;
            }
        }
    }
    tarjan(1, -1);
    id = 0;
    for(int i=1; i<=n; ++i){
        if(!comp[i]){
            id++;
            dfsmark(i, -1);
        }
    }
    for(int i=1; i<=m; ++i){
        if(!isbridge[i])continue;
        int a = comp[edges[i].first];
        int b = comp[edges[i].second];
        bcadj[a].push_back(b);
        bcadj[b].push_back(a);
    }
    dfsbctree(1, -1);
    int q;cin >> q;
    while(q--){
        int a, b;cin >> a >> b;
        a = comp[a];
        b = comp[b];
        int c = lca(a, b);
        sum1[a]++;
        sum1[c]--;
        sum2[b]++;
        sum2[c]--;
    }
    dfscalans(1, -1);
    for(int i=1; i<=m; ++i){
        if(!isbridge[i]){
            cout << "B";
            continue;
        }
        int a = edges[i].first;
        int b = edges[i].second;
        a = comp[a];b = comp[b];
        bool swapped = 0;
        if(dep[a] < dep[b]){
            swap(a, b);
            swapped = 1;
        }
        bool dir;
        if(sum1[a] > 0){
            dir = 1;//up
        }
        else if(sum2[a] > 0){
            dir = 0;//down
        }
        else{
            cout << "B";
            continue;
        }
        if(dir ^ swapped){
            cout << "R";
        }
        else{
            cout << "L";
        }
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...