제출 #449015

#제출 시각아이디문제언어결과실행 시간메모리
449015ak2006One-Way Streets (CEOI17_oneway)C++14
100 / 100
171 ms25860 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vb = vector<bool>;
using vvb = vector<vb>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vc = vector<char>;
using vvc = vector<vc>;
using vs = vector<string>;
const ll mod = 1e9 + 7,inf = 1e18;
#define pb push_back
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void setIO()
{
    fast;
}
int n = 1e5 + 5,m,cmp,TIMER;
vvi adj(n),graph(n);
vb ins(n);
vi dfs_time(n),dfs_low(n),num(n),scc(n),dist(n);
stack<int>s;
void dfs(int u,int p)
{
    dfs_low[u] = dfs_time[u] = ++TIMER;
    s.push(u);
    ins[u] = 1;
    for (int v:adj[u]){
        if (v == p){p = -1;continue;}
        if (!dfs_time[v]){
            dfs(v,u);
            dfs_low[u] = min(dfs_low[u],dfs_low[v]);
            continue;
        }
        if (ins[v])
            dfs_low[u] = min(dfs_low[u],dfs_time[v]);
    }
    if (dfs_time[u] == dfs_low[u]){
        int v = -1;
        cmp++;
        while (v != u){
            v = s.top();
            scc[v] = cmp;
            ins[v] = 0;
            s.pop();   
        }
    }
}   
void tree(int u,int p)
{
    for (int v:graph[u]){
        if (v == p)continue;
        dist[v] = dist[u] + 1;
        tree(v,u);
        num[u] += num[v];
    }
    //cout<<u<<" "<<num[u]<<endl;
}
int main()
{
    setIO();
    cin>>n>>m;
    vvi edges;
    while (m--){
        int u,v;
        cin>>u>>v;
        adj[u].pb(v),adj[v].pb(u);
        edges.pb({u,v});
    }
    for (int i = 1;i<=n;i++)
        if (!dfs_time[i])dfs(i,-1);
    int q;
    cin>>q;
    while (q--){
        int u,v;
        cin>>u>>v;
        num[scc[u]]++,num[scc[v]]--;
        //cout<<"HERE "<<scc[u]<<" "<<scc[v]<<" "<<num[scc[u]]<<" "<<num[scc[v]]<<endl;
    }
    for (auto it:edges){
        int u = scc[it[0]],v = scc[it[1]];
        if (u != v)
        graph[u].pb(v),graph[v].pb(u);
    }
    for (int i = 1;i<=cmp;i++)
        if (!dist[i])tree(i,-1);
    
    for (auto it:edges){
        int u = scc[it[0]],v = scc[it[1]];
        if (dist[u] > dist[v])swap(u,v);
        //cout<<u<<" "<<v<<" "<<num[u]<<" "<<num[v]<<endl;
    }
    for (auto it:edges){
        int u = scc[it[0]],v = scc[it[1]];
        if (u == v){cout<<"B";continue;}
        
        if (dist[u] > dist[v]){
            if (num[u] > 0)cout<<"R";
            else if (num[u] == 0)cout<<"B";
            else cout<<"L";
        }
        else{
            if (num[v] > 0)cout<<"L";
            else if (num[v] == 0)cout<<"B";
            else cout<<"R";
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...