제출 #1247380

#제출 시각아이디문제언어결과실행 시간메모리
1247380khoiOne-Way Streets (CEOI17_oneway)C++20
0 / 100
1 ms2624 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

const int MAXN = 100000;
int n, m, p;
vector<pii> adj[MAXN+1];      // (neighbor, edge_index)
int parent_edge[MAXN+1];      // edge index to parent in DFS tree
int depth[MAXN+1], low[MAXN+1], tin[MAXN+1], timer;
bool is_tree_edge[200000+5];  // mark edges in DFS tree
char ans[200000+5];           // answer for each edge: 'L','R','B'
int d1[MAXN+1], d2[MAXN+1];  // counters for non-tree edges and queries
pii edges[200000+5];          // original edges (u,v)

// 1) DFS to build tree, compute tin & low, mark tree edges
void dfs1(int u, int pe) {
    tin[u] = low[u] = ++timer;
    for (auto [v, ei] : adj[u]) {
        if (ei == pe) continue;
        if (!tin[v]) {
            is_tree_edge[ei] = true;
            parent_edge[v] = ei;
            dfs1(v, ei);
            low[u] = min(low[u], low[v]);
        } else {
            // back edge
            low[u] = min(low[u], tin[v]);
        }
    }
}

// 2) Post-order DFS to assign edge directions
void dfs2(int u) {
    for (auto [v, ei] : adj[u]) {
        if (!is_tree_edge[ei] || edges[ei].first != u) continue;
        // process child v
        dfs2(v);
        // default B
        ans[ei] = 'B';
        // if subtree sum for non-tree edges is zero, and no pending queries, skip
        if (d1[v] != 0 || d2[v] != 0) {
            // decide direction
            // if queries more exit than enter, orient from v->u else u->v
            bool go_up = (d2[v] > 0);
            if (go_up) ans[ei] = 'R';
            else ans[ei] = 'L';
        }
        // accumulate to parent
        d1[u] += d1[v];
        d2[u] += d2[v];
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        edges[i] = {u, v};
        adj[u].emplace_back(v, i);
        adj[v].emplace_back(u, i);
    }

    // build DFS tree
    dfs1(1, -1);

    // non-tree edges: mark B and update d1
    for (int i = 0; i < m; i++) {
        if (!is_tree_edge[i]) {
            ans[i] = 'B';
            auto [u, v] = edges[i];
            d1[u]++; d1[v]--;
        }
    }

    // read queries, update d2
    cin >> p;
    while (p--) {
        int a, b;
        cin >> a >> b;
        d2[a]++; d2[b]--;
    }

    // propagate and assign directions
    dfs2(1);

    // output
    for (int i = 0; i < m; i++) cout << ans[i];
    cout << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...