Submission #1259480

#TimeUsernameProblemLanguageResultExecution timeMemory
1259480danghuyOne-Way Streets (CEOI17_oneway)C++20
100 / 100
147 ms46688 KiB
#include <bits/stdc++.h>
using namespace std;
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
#define si size()
#define fi first
#define se second
#define ll int
#define sr sort
#define pb push_back
const ll MAXN=1e5+5,MOD=1e6,LG=19;
ll n,m,j,k,p,i,f,dem,ans,t,l,r=1,timedfs,id[MAXN],num[MAXN];
ll low[MAXN],mark[MAXN],a[MAXN],b[MAXN],up[MAXN][20];
ll goup[MAXN],godown[MAXN],cntup[MAXN],cntdown[MAXN];
ll h[MAXN],par[MAXN],bripar[MAXN];
stack<ll> scc;
vector<pair<ll,ll>> adj[MAXN],adj1[MAXN];
vector<ll> child[MAXN];
map<pair<ll,ll>,ll> ma;
ll comp;

void dfs(ll st,ll preEdge){
    num[st]=low[st]=++timedfs;
    scc.push(st);
    for(auto x:adj[st]){
        ll v=x.fi, idEdge=x.se;
        if(idEdge==preEdge) continue;
        if(!num[v]){
            dfs(v,idEdge);
            low[st]=min(low[st],low[v]);
        } else {
            low[st]=min(low[st],num[v]);
        }
    }
    if(low[st]==num[st]){
        ++comp;
        while(true){
            ll v=scc.top(); scc.pop();
            id[v]=comp;
            if(v==st) break;
        }
    }
}

void dfs1(ll st,ll pre){
    for(auto x:adj1[st]){
        if(x.fi==pre) continue;
        h[x.fi]=h[st]+1;
        up[x.fi][0]=st;
        par[x.fi]=st;
        bripar[x.fi]=x.se;
        child[st].pb(x.fi);
        for(ll j=1;j<=LG;j++){
            if(up[x.fi][j-1]) up[x.fi][j]=up[ up[x.fi][j-1] ][j-1];
            else break;
        }
        dfs1(x.fi,st);
    }
}

ll lca(ll u,ll v){
    if(h[u]!=h[v]){
        if(h[u]<h[v]) swap(u,v);
        ll cnt=h[u]-h[v];
        for(ll j=0;j<=LG;j++)
            if((cnt>>j)&1) u=up[u][j];
    }
    if(u==v) return u;
    for(ll j=LG;j>=0;j--)
        if(up[u][j]!=up[v][j])
            u=up[u][j],v=up[v][j];
    return up[u][0];
}

void dfs2(ll st,ll pre){
    for(ll x:child[st]){
        dfs2(x,st);
        goup[st]+=goup[x];
        godown[st]+=godown[x];
        cntup[ bripar[x] ]   = goup[x];
        cntdown[ bripar[x] ] = godown[x];
    }
}

int main(){ 
    ios::sync_with_stdio(false);    
    cin.tie(nullptr);cout.tie(0);

    cin>>n>>m;
    for(i=1;i<=m;i++){
        ll u,v; cin>>u>>v;
        a[i]=u; b[i]=v;
        adj[u].pb({v,i});
        adj[v].pb({u,i});
        ma[{min(u,v),max(u,v)}]++;
    }

    for(i=1;i<=n;i++)
        if(!num[i]) dfs(i,0);

    unordered_set<ll> s;
    for(i=1;i<=m;i++){
        if(id[a[i]]==id[b[i]] || ma[{min(a[i],b[i]),max(a[i],b[i])}]>1){
            mark[i]=2;
        } else {
            adj1[id[a[i]]].pb({id[b[i]],i});
            adj1[id[b[i]]].pb({id[a[i]],i});
            s.insert(id[a[i]]);
            s.insert(id[b[i]]);
        }
    }

    vector<ll> roots;
    for(ll x:s){
        if(h[x]) continue;
        roots.pb(x);
        dfs1(x,x);
    }

    cin>>k;
    for(i=1;i<=k;i++){
        ll u,v; cin>>u>>v;
        u=id[u]; v=id[v];
        ll w=lca(u,v);
        if(w==0) continue;
        goup[u]++; goup[w]--;
        godown[v]++; godown[w]--;
    }

    for(ll x:roots) dfs2(x,0);

    for(i=1;i<=m;i++){
        if(!mark[i]){
            ll f = (h[id[a[i]]]<h[id[b[i]]]?0:1);
            if(cntup[i] && !cntdown[i])      mark[i]=!f;
            else if(cntdown[i] && !cntup[i]) mark[i]=f;
            else                              mark[i]=2;
        }
    }

    for(i=1;i<=m;i++){
        if(mark[i]==0) cout<<'R';
        else if(mark[i]==1) cout<<'L';
        else cout<<'B';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...