제출 #1268054

#제출 시각아이디문제언어결과실행 시간메모리
1268054SofiatpcOne-Way Streets (CEOI17_oneway)C++20
60 / 100
3096 ms18756 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define sc second
#define sz(v) (int)v.size()
const int MAXN = 1*1e5+5;
vector< pair<int,int> > adj[MAXN], adj2[MAXN];
int pai[MAXN], s[MAXN], dist[MAXN], low[MAXN], nxt[MAXN];
int u[MAXN], v[MAXN], ans[MAXN]; //1 R 2 L

int find(int x){
    if(pai[x] == x)return x;
    return pai[x] = find(pai[x]);
}

void merge(int a, int b){
    a = find(a), b = find(b);
    if(a == b)return;
    if(s[a] < s[b])swap(a,b);
    pai[b] = a;
    s[a] += s[b];
}

void dfs(int s, int p){
    low[s] = dist[s];

    int qtd = 0;
    for(int i = 0; i < sz(adj[s]); i++){
        int viz = adj[s][i].fi;

        if(qtd == 0 && viz == p){qtd++; continue;}
        if(dist[viz])low[s] = min(low[s],low[viz]);
        else{
            dist[viz] = dist[s]+1;
            dfs(viz,s);
            low[s] = min(low[s],low[viz]);

            if(low[viz] <= dist[s])merge(s,viz);
        }
    }
}

void dfs2(int s){
    for(int i = 0; i < sz(adj2[s]); i++){
        int viz = adj2[s][i].fi, id = adj2[s][i].sc;
        if(id != nxt[s]){
            nxt[viz] = id;
            dist[viz] = dist[s]+1;
            dfs2(viz);
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n,m; cin>>n>>m;
    for(int i = 1; i <= n; i++){
        pai[i] = i; s[i] = 1;
    }

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

    for(int i = 1; i <= n; i++)
        if(dist[i] == 0){
            dist[i] = 1;
            dfs(i,0);
        }
    
    for(int i = 1; i <= n; i++){
        int repi = find(i);
        for(int j = 0; j < sz(adj[i]); j++){
            int viz = adj[i][j].fi, id = adj[i][j].sc;

            int repviz = find(viz);
            if(i < viz && repi != repviz){
                if(u[id] == i){u[id] = repi; v[id] = repviz;}
                else {u[id] = repviz; v[id] = repi;}

                adj2[repi].emplace_back(repviz,id);
                adj2[repviz].emplace_back(repi,id);
            }
        }

        dist[i] = 0;
    }
    
    for(int i = 1; i <= n; i++)
        if(dist[i] == 0){
            dist[i] = 1;
            dfs2(i);
        }  

    int q; cin>>q;
    while(q--){
        int a,b; cin>>a>>b;
        a = find(a), b = find(b);

        while(a != b){
            if(dist[a] > dist[b]){
                if(u[nxt[a]] == a){
                    ans[nxt[a]] = 1;
                    a = v[nxt[a]];
                }else{
                    ans[nxt[a]] = 2;
                    a = u[nxt[a]];
                }
            }else{
                if(u[nxt[b]] == b){
                    ans[nxt[b]] = 2;
                    b = v[nxt[b]];
                }else{
                    ans[nxt[b]] = 1;
                    b = u[nxt[b]];
                }
            }
        }
    }

    for(int i = 1; i <= m; i++){
        if(ans[i] == 0)cout<<"B";
        else if(ans[i] == 1)cout<<"R";
        else cout<<"L";
    }
    cout<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...