제출 #1282376

#제출 시각아이디문제언어결과실행 시간메모리
1282376warrennOne-Way Streets (CEOI17_oneway)C++20
0 / 100
1 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#pragma GCC optimize("O3,unroll-loops")

const int maxn=1e5;
int n,m;
vector<pair<int,int> >adj[maxn+2];
int dsu[maxn+2],val[maxn+2],vis[maxn+2];
int bridge[maxn+2],disc[maxn+2],low[maxn+2],ans[maxn+2];
pair<int,int>road[maxn+2];

int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

void merg(int a,int b){
    a=fin(a); b=fin(b);
    if(a==b)return ;
    dsu[a]=b;
}

void dfs(int cur,int par){
    low[cur]=disc[cur]=disc[par]+1;

    int cnt=0;

    for(auto x : adj[cur]){
        if(cnt==0 && x.first==par){
            cnt++; continue;
        }
        if(disc[x.first]){
            low[cur]=min(low[cur],low[x.first]);
        }
        else{
            dfs(x.first,cur);
            if(low[x.first]>disc[cur]){
                bridge[x.second]=1;
            }
            low[cur]=min(low[cur],low[x.first]);
        }
    }
}

void dfs2(int cur,int par){
    vis[cur]=true;
    for(auto x : adj[cur]){
        if(x.first==par)continue;
        dfs2(x.first,cur);
        val[cur]+=val[x.first];

        if(val[x.first]>0){
            if(road[x.second].first==cur){
                ans[x.second]=2;
            }
            else{
                ans[x.second]=1;
            }
        }
        else if(val[x.first]<0){
            if(road[x.second].first==cur){
                ans[x.second]=1;
            }
            else{
                ans[x.second]=2;
            }
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int q=1;q<=n;q++){
        dsu[q]=q;
    }
    for(int q=1;q<=m;q++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back({v,q});
        adj[v].push_back({u,q});
        road[q]={u,v};
    }

    for(int q=1;q<=n;q++){
        if(disc[q])continue;
        dfs(q,0);
    }
    

    for(int q=1;q<=m;q++){
        if(!bridge[q])merg(road[q].first,road[q].second);
    }
    for(int q=1;q<=n;q++)adj[q].clear();
    for(int q=1;q<=m;q++){
        if(bridge[q]){
            adj[fin(road[q].first)].push_back({fin(road[q].second),q});
            adj[fin(road[q].second)].push_back({fin(road[q].first),q});
        }
    }

    int qu;
    cin>>qu;
    while(qu--){
        int u,v;
        cin>>u>>v;
        val[fin(u)]++; val[fin(v)]--;
    }

    for(int q=1;q<=n;q++){
        if(fin(q)!=q )continue;
        dfs2(q,0);
    }
    
    for(int q=1;q<=m;q++){
        if(ans[q]==0){
            cout<<'B';
        }
        else if(ans[q]==1){
            cout<<'R';
        }
        else{
            cout<<'L';
        }
    }
    cout<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...