Submission #1293201

#TimeUsernameProblemLanguageResultExecution timeMemory
1293201chaoslongOne-Way Streets (CEOI17_oneway)C++20
0 / 100
2 ms332 KiB
// Calm down.
// Think three times, code twice.
#include "bits/stdc++.h"
#define forr(_a,_b,_c) for(int _a = (_b); _a <= (_c); ++_a)
#define ford(_a,_b,_c) for(int _a = (_b) + 1; _a --> (_c);)
#define forf(_a,_b,_c) for(int _a = (_b); _a < (_c); ++_a)
#define st first
#define nd second
#define ll long long
#define ull unsigned long long
#define pii pair <int,int>
#define pll pair <ll,ll>
#define piii pair <int,pii>
#define vi vector <int>
#define pb push_back
#define mp make_pair
#define all(x) begin(x),end(x)
#define mask(i) (1LL << (i))
#define bit(x, i) (((x) >> (i)) & 1)
#define bp __builtin_popcountll
#define file "test"

using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7; // 998244353
const ll oo = 1e18;

int n, m, p, low[N], num[N], par[N], color[N], timer = 0, scc = 0, h[N], p2[N], tin[N], head[N], heavy[N], res[N], euler[N];
stack<int> s;
bool deleted[N];
vector<pii> a[N], g[N];
char ans[N];
pii f[N], tmp[N];

void dfs(int u, int pre) {
    num[u] = low[u] = ++timer;
    s.push(u);
    for(pii e: a[u]) {
        int v = e.st, cur = e.nd;
        if(deleted[v] || cur == pre) continue;
        if(!num[v]) {
            par[v] = u;
            dfs(v, cur);
            low[u] = min(low[u], low[v]);
        } else low[u] = min(low[u], num[v]);
    }
//    cout << u << " " << num[u] << " " << low[u] << "\n";
    if(low[u] == num[u]) {
        scc++;
        int v;
        do {
            v = s.top();
            s.pop();
            deleted[v] = 1;
            color[v] = scc;
        } while(v != u);
    }
}

int dfs2(int u, int pre) {
    int sz = 0, mx = 0;
    for(pii e: g[u]) {
        int v = e.st;
        if(v == pre) continue;
        h[v] = h[u] + 1;
        p2[v] = u;
        int cur = dfs2(v, u);
        if(cur > mx) {
            mx = cur;
            heavy[u] = v;
        }
        sz += cur;
    }
    return sz;
}

void hld(int u, int cur) {
    tin[u] = ++timer;
    euler[timer] = u;
    head[u] = cur;
    if(heavy[u]) {
        hld(heavy[u], cur);
    }
    for(pii e: g[u]) {
        int v = e.st;
        if(v == p2[u] || v == heavy[u]) continue;
        hld(v, v);
    }
}

struct seg {
    vector<int> t, lazy;
    int n;
    void init(int _n) {
        n = _n;
        t.assign(4 * n + 5, 0);
        lazy.assign(4 * n + 5, 0);
    }

    void push_down(int id, int l, int r, int mid) {
        if(!lazy[id]) return;
        int val = lazy[id]; lazy[id] = 0;
        t[id << 1] = t[id << 1 | 1] = lazy[id << 1] = lazy[id << 1 | 1] = val;
    }

    void update(int id, int l, int r, int u, int v, int val) {
        if(l > v || r < u || l > r || u > v) return;
        if(u <= l && r <= v) {
            t[id] = val;
            lazy[id] = val;
            return;
        }
        int mid = (l + r) >> 1;
        push_down(id, l, r, mid);
        update(id << 1, l, mid, u, v, val);
        update(id << 1 | 1, mid + 1, r, u, v, val);
        t[id] = max(t[id << 1], t[id << 1 | 1]);
    }

    void down(int id, int l, int r) {
        if(l == r) {
//            cout << l << " " << t[id] << "\n";
            res[euler[l]] = t[id];
            return;
        }
        int mid = (l + r) >> 1;
        push_down(id, l, r, mid);
        down(id << 1, l, mid);
        down(id << 1 | 1, mid + 1, r);
    }

    void update(int u, int v, int val) {
        update(1, 1, n, u, v, val);
    }
} it;

void update(int u, int v) {
    while(head[u] != head[v]) {
        if(tin[head[u]] < tin[head[v]]) {
            it.update(tin[head[v]], tin[v], 2);
            v = p2[head[v]];
        } else {
            it.update(tin[head[u]], tin[u], 1);
            u = p2[head[u]];
        }
    }
    if(tin[u] < tin[v]) {
        it.update(tin[u] + 1, tin[v], 2);
    } else {
        it.update(tin[v] + 1, tin[u], 1);
    }
}

void dfs3(int u, int pre) {
    for(pii e: g[u]) {
        int v = e.st, id = e.nd;
        if(v == pre) continue;
        dfs3(v, u);
//        cout << u << " " << v << " " << res[v] << "\n";
        if(res[v] == 1) {
            int l = v, r = u;
            if(l == tmp[id].st && r == tmp[id].nd) {
                ans[id] = 'R';
            } else {
                ans[id] = 'L';
            }
        } else if(res[v] == 2) {
            int l = u, r = v;
            if(l == tmp[id].st && r == tmp[id].nd) {
                ans[id] = 'R';
            } else {
                ans[id] = 'L';
            }
        } else {
            ans[id] = 'B';
        }
    }
}

void to_nho_cau() {
    cin >> n >> m;
    forr(i, 1, m) {
        int u, v; cin >> u >> v;
        a[u].pb({v, i});
        a[v].pb({u, i});
        f[i].st = u; f[i].nd = v;
    }
    dfs(1, 0);
//    forr(i, 1, n) cout << color[i] << " ";
    forr(i, 1, m) {
        int u = color[f[i].st], v = color[f[i].nd];
        if(u != v) {
            g[u].pb({v, i});
            g[v].pb({u, i});
            tmp[i] = {u, v};
//            cout << u << " " << v << "\n";
        } else {
//            cout << i << "\n";
            ans[i] = 'B';
        }
    }
    timer = 0;
    dfs2(1, 0);
    hld(1, 1);
    it.init(timer);
    cin >> p;
    forr(i, 1, p) {
        int u, v; cin >> u >> v;
        u = color[u], v = color[v];
//        cout << u << " " << v << "\n";
        update(u, v);
    }
    it.down(1, 1, timer);
//    forr(i, 1, n) cout << res[i] << " "; cout << "\n";
    dfs3(1, 0);
    forr(i, 1, m) cout << ans[i];
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    #ifdef LOCAL
        freopen(file".inp","r",stdin);
        freopen(file".out","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while(t--) to_nho_cau();
}
/*
1.self check:
2.long long
3.size of array
4.code for testing
5.initializing
6.modulo number
*/
/**
 ∧__∧
(`•ω• )づ__∧
(つ  /( •ω•。)
  しーJ (nnノ) pat pat
**/
/**  /\_/\
*   (= ._.)
*   / >☕ \>💻
**/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...