제출 #1268069

#제출 시각아이디문제언어결과실행 시간메모리
1268069SofiatpcOne-Way Streets (CEOI17_oneway)C++20
100 / 100
59 ms22208 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, MAX = 16;
vector< pair<int,int> > adj[MAXN], adj2[MAXN];
vector<int> ponte;
int pai[MAXN], s[MAXN], dist[MAXN], low[MAXN], val[MAXN];
int u[MAXN], v[MAXN], ans[MAXN]; 

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, id = adj[s][i].sc;

        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);
            else ponte.push_back(id);
        }
    }
}

void dfs2(int s,int p){
    dist[s] = 1;

    for(int i = 0; i < sz(adj2[s]); i++){
        int viz = adj2[s][i].fi, id = adj2[s][i].sc;
        if(viz == p)continue;

        dfs2(viz,s);
        if(val[viz] < 0){
            if(u[id] == s)ans[id] = 1;
            else ans[id] = 2;
        }
        if(val[viz] > 0){
            if(u[id] == s)ans[id] = 2;
            else ans[id] = 1;
        }
        
        val[s] += val[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 = 0; i < sz(ponte); i++){
        u[ponte[i]] = find(u[ponte[i]]), v[ponte[i]] = find(v[ponte[i]]);
        adj2[u[ponte[i]]].emplace_back(v[ponte[i]],ponte[i]);
        adj2[v[ponte[i]]].emplace_back(u[ponte[i]],ponte[i]);
    }

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

        val[find(a)]++; val[find(b)]--;
    }

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

    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...