Submission #1180899

#TimeUsernameProblemLanguageResultExecution timeMemory
1180899LithaniumOne-Way Streets (CEOI17_oneway)C++20
0 / 100
3 ms4928 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> adj[100005];
vector<pair<int, int>> cact[100005];
int dsu[100005], dt[100005][2];
int up[100005];
int reach[100005];
int tot[100005];
int ans[100005]; // 1 -> R, 2 -> L

int find(int n) {
    if (dsu[n] == n) return n;
    return dsu[n] = find(dsu[n]);
}

void merge(int a, int b) {
    dsu[find(a)] = find(b);
}

void dfs(int n, int f, int d = 1) {
    reach[n] = d;
    for (int i:adj[n]) if (i != f) {
        if (!reach[i]) dfs(i, n, d+1);
        reach[n] = min(reach[n], reach[i]);
    }
    if (reach[n] < d) merge(n, f);
}

vector<int> order;

void c(int n, int f) {
    for (auto [i, j]:cact[n]) if (i != f) {
        up[i] = j;
        c(i, n);
    }
    order.push_back(n);
}

int main() {
    int N, M;
    cin >> N >> M;
    for (int i = 1; i <= M; i ++) {
        cin >> dt[i][0] >> dt[i][1];
        int a = dt[i][0], b = dt[i][1];
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for (int i = 1; i <= N; i ++) dsu[i] = i;
    dfs(1, 0);
    for (int i = 1; i <= M; i ++) {
        int a = dt[i][0], b = dt[i][1];
        if (find(a) != find(b)) {
            cact[find(a)].push_back({find(b), i});
            cact[find(b)].push_back({find(a), i});
        }
    }
    c(find(1), 0);
    int Q;
    cin >> Q;
    while (Q --) {
        int a, b;
        cin >> a >> b;
        if (find(a) != find(b)) {
            tot[find(a)] ++, tot[find(b)] --;
        }
    }
    for (int node:order) if (node != find(1)) {
        if (tot[node] > 0) {
            // move up
            int a = dt[up[node]][0], b = dt[up[node]][1];
            if (find(a) == node) ans[up[node]] = 1;
            else ans[up[node]] = 2;
        } else if (tot[node] < 0) {
            int a = dt[up[node]][0], b = dt[up[node]][1];
            if (find(a) == node) ans[up[node]] = 2;
            else ans[up[node]] = 1;
        }
    }
    for (int i = 1; i <= M; i ++) {
        if (ans[i] == 1) cout << "R";
        else if (ans[i] == 2) cout << "L";
        else cout << "B";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...