답안 #872846

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
872846 2023-11-14T00:04:09 Z MisterReaper One-Way Streets (CEOI17_oneway) C++17
100 / 100
169 ms 28492 KB
//author: Ahmet Alp Orakci
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
 
#define ONLINE_JUDGE
void solve() {
    int n, m;
    cin >> n >> m;
 
    map <pair <int, int>, int> mp;
    vector <pair <int, int>> adj[n +1];
    vector <pair <int, int>> edges(m);
    for(int i = 0; i < m; i++) {
        cin >> edges[i].first >> edges[i].second;
        adj[edges[i].first].emplace_back(edges[i].second, i);
        adj[edges[i].second].emplace_back(edges[i].first, i);
        mp[{min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second)}]++;
    }
 
    int timer = 0;
    vector <int> tin(n +1, -1), low(n +1, -1), is_bridge(m);
    function <void(int, int)> dfs = [&](int node, int par) -> void {
        low[node] = tin[node] = timer++;
        for(auto [child, number] : adj[node]) {
            if(child == par) {
                continue;
            }
 
            if(tin[child] == -1) {
                dfs(child, node);
                low[node] = min(low[node], low[child]);
                if(low[child] > tin[node]) {
                    //cerr << node << " " << child << " :: " << number << "\n";
                    is_bridge[number] = true;
                }
            } else {
                low[node] = min(low[node], tin[child]);
            }
        }
    };
 
    for(int i = 1; i <= n; i++) {
        if(tin[i] == -1) {
            dfs(i, -1);
        }
    }
 
    string res(m, 'B');
    for(int i = 0; i < m; i++) {
        if(mp[{min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second)}] > 1) {
            //cerr << edges[i].first << " " << edges[i].second << " :: " << i << "\n";
            is_bridge[i] = false;
        }
 
        if(is_bridge[i]) {
            res[i] = 'X';
        }
    }
 
    //cerr << res << "\n";
 
    vector <int> compo(n +1, -1);
    function <void(int, int)> dfsC = [&](int node, int color) {
        compo[node] = color;
        for(auto [child, num] : adj[node]) {
            if(compo[child] == -1 && !is_bridge[num]) {
                dfsC(child, color);
            }
        }
    };
 
    int col = 0;
    for(int i = 1; i <= n; i++) {
        if(compo[i] == -1) {
            dfsC(i, col);
            col++;
        }
    }
 
    /*
    for(int i = 1; i <= n; i++) {
        cerr << compo[i] << " \n"[i == n];
    }
    */
 
    vector <pair <int, int>> nadj[col];
    for(int i = 0; i < m; i++) {
        if(is_bridge[i]) {
            int x = compo[edges[i].first], y = compo[edges[i].second];
            //cerr << i << " -> " << edges[i].first << " " << edges[i].second << " :: " << compo[edges[i].first] << " " << compo[edges[i].second] << "\n";
            nadj[min(x, y)].emplace_back(max(x, y), i);
            nadj[max(x, y)].emplace_back(min(x, y), i);
        }
    }
 
    int p;
    cin >> p;
 
    vector <int> val(col);
    for(int i = 1; i <= p; i++) {
        int a, b;
        cin >> a >> b;
        //cerr << a << " " << b << " :: " << compo[a] << " " << compo[b] << "\n";
        val[compo[a]]++;
        val[compo[b]]--;
    }
 
    vector <int> vis(col, -1);
    function <void(int, int)> DFS = [&](int node, int par) -> void {
        //cerr << node << " ";
        vis[node] = 0;
        for(auto [child, num] : nadj[node]) {
            if(par == child)
                continue;
            if(vis[child] == -1)
                DFS(child, node);
            val[node] += val[child];
            vis[node] = max(vis[node], vis[child] +1);
        }
    };
 
    for(int i = 0; i < col; i++) {
        if(vis[i] == -1) {
            DFS(i, -1);
        }
    }
 
    //cerr << "\n";

    for(int i = 0; i < m; i++) {
        if(res[i] == 'X') {
            int x = compo[edges[i].first], y = compo[edges[i].second];
            //cerr << i << " || " << edges[i].first << " " << edges[i].second << " :: " << x << " " << y << " -> " << val[x] << " " << val[y] << " // " << vis[x] << " " << vis[y] << "\n";
            if(vis[x] > vis[y]) {
                if(val[y] > 0)
                    res[i] = 'L';
                else if(val[y] < 0)
                    res[i] = 'R';
                else
                    res[i] = 'B';
            } else if(vis[x] < vis[y]) {
                if(val[x] > 0)
                    res[i] = 'R';
                else if(val[x] < 0)
                    res[i] = 'L';
                else
                    res[i] = 'B';
            } else {
                res[i] = 'B';
            }
        }
    }
 
    cout << res;
    
    return;
}
 
signed main() {
    #ifndef ONLINE_JUDGE
        freopen(".in", "r", stdin);
        freopen(".out", "w", stdout);
    #endif
 
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    int t = 1; //cin >> t;
    for(int i = 1; i <= t; i++) {
        solve();
    }
 
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 600 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 600 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 79 ms 13096 KB Output is correct
12 Correct 89 ms 14672 KB Output is correct
13 Correct 129 ms 16120 KB Output is correct
14 Correct 123 ms 18516 KB Output is correct
15 Correct 133 ms 18940 KB Output is correct
16 Correct 148 ms 22132 KB Output is correct
17 Correct 154 ms 24240 KB Output is correct
18 Correct 119 ms 22100 KB Output is correct
19 Correct 118 ms 25680 KB Output is correct
20 Correct 122 ms 14520 KB Output is correct
21 Correct 77 ms 13716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 600 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 79 ms 13096 KB Output is correct
12 Correct 89 ms 14672 KB Output is correct
13 Correct 129 ms 16120 KB Output is correct
14 Correct 123 ms 18516 KB Output is correct
15 Correct 133 ms 18940 KB Output is correct
16 Correct 148 ms 22132 KB Output is correct
17 Correct 154 ms 24240 KB Output is correct
18 Correct 119 ms 22100 KB Output is correct
19 Correct 118 ms 25680 KB Output is correct
20 Correct 122 ms 14520 KB Output is correct
21 Correct 77 ms 13716 KB Output is correct
22 Correct 121 ms 24148 KB Output is correct
23 Correct 124 ms 21844 KB Output is correct
24 Correct 169 ms 22136 KB Output is correct
25 Correct 134 ms 28492 KB Output is correct
26 Correct 123 ms 23928 KB Output is correct
27 Correct 156 ms 21976 KB Output is correct
28 Correct 39 ms 4188 KB Output is correct
29 Correct 93 ms 13668 KB Output is correct
30 Correct 94 ms 13912 KB Output is correct
31 Correct 108 ms 14420 KB Output is correct
32 Correct 94 ms 16804 KB Output is correct